[英]GridView PageIndexChanging event is not firing inside UpdatePanel
[英]Custom Paging for GridView in an UpdatePanel not firing PageIndexChanging event
我有一個 GridView,它在 UpdatePanel 中使用自定義分頁(這樣 gridview 的分頁和排序不會導致回發)。 排序工作正常,但分頁沒有。 PageIndexChanging 事件永遠不會被調用。
這是aspx代碼:
<asp:UpdatePanel runat="server" ID="upSearchResults" ChildrenAsTriggers="true" UpdateMode="Always">
<ContentTemplate>
<asp:GridView ID="gvSearchResults" runat="server" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" OnDataBound="gvSearchResults_DataBound"
OnRowDataBound ="gvSearchResults_RowDataBound" OnSorting="gvSearchResults_Sorting" OnPageIndexChanging="gvSearchResults_PageIndexChanging" Width="100%" EnableSortingAndPagingCallbacks="false">
<Columns>
<asp:TemplateField HeaderText="Select" HeaderStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:HyperLink ID="lnkAdd" runat="server">Add</asp:HyperLink>
<asp:HiddenField ID="hfPersonId" runat="server" Value='<%# Eval("Id") %>'/>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="First Name" DataField="FirstName" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" SortExpression="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField="LastName" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" SortExpression="LastName" />
<asp:TemplateField HeaderText="Phone Number" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign="Center" >
<ItemTemplate>
<asp:Label ID="lblPhone" runat="server" Text="" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerTemplate>
<table width="100%" class="pager">
<tr>
<td>
</td>
</tr>
</table>
</PagerTemplate>
</asp:GridView>
<div class="btnContainer">
<div class="btn btn-height_small btn-style_dominant">
<asp:LinkButton ID="lbtNewRecord" runat="server" OnClick="lbtNewRecord_Click"><span>Create New Record</span></asp:LinkButton>
</div>
<div class="btn btn-height_small btn-style_subtle">
<a onclick="openParticipantModal();"><span>Cancel</span></a>
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="gvSearchResults" EventName="PageIndexChanging" />
<asp:AsyncPostBackTrigger ControlID="gvSearchResults" EventName="Sorting" />
</Triggers>
</asp:UpdatePanel>
在后面的代碼中,我有一個在 GridView OnDataBound 事件上調用的 SetPaging 方法:
private void SetPaging(GridView gv)
{
GridViewRow row = gv.BottomPagerRow;
var place = row.Cells[0];
var first = new LinkButton();
first.CommandName = "Page";
first.CommandArgument = "First";
first.Text = "First";
first.ToolTip = "First Page";
if (place != null) place.Controls.Add(first);
var lbl = new Label();
lbl.Text = " ";
if (place != null) place.Controls.Add(lbl);
var prev = new LinkButton();
prev.CommandName = "Page";
prev.CommandArgument = "Prev";
prev.Text = "Prev";
prev.ToolTip = "Previous Page";
if (place != null) place.Controls.Add(prev);
var lbl2 = new Label();
lbl2.Text = " ";
if (place != null) place.Controls.Add(lbl2);
for (int i = 1; i <= gv.PageCount; i++)
{
var btn = new LinkButton();
btn.CommandName = "Page";
btn.CommandArgument = i.ToString();
if (i == gv.PageIndex + 1)
{
btn.BackColor = Color.Gray;
}
btn.Text = i.ToString();
btn.ToolTip = "Page " + i.ToString();
if (place != null) place.Controls.Add(btn);
var lbl3 = new Label();
lbl3.Text = " ";
if (place != null) place.Controls.Add(lbl3);
}
var next = new LinkButton();
next.CommandName = "Page";
next.CommandArgument = "Next";
next.Text = "Next";
next.ToolTip = "Next Page";
if (place != null) place.Controls.Add(next);
var lbl4 = new Label();
lbl4.Text = " ";
if (place != null) place.Controls.Add(lbl4);
var last = new LinkButton();
last.CommandName = "Page";
last.CommandArgument = "Last";
last.Text = "Last";
last.ToolTip = "Last Page";
if (place != null) place.Controls.Add(last);
var lbl5 = new Label();
lbl5.Text = " ";
if (place != null) place.Controls.Add(lbl5);
}
如果我不使用自定義分頁,分頁就可以工作,但我確實需要使用自定義分頁。 我不明白為什么在使用自定義分頁時沒有觸發 PageIndexChanging 事件。
謝謝,
傑夫
其他事件,如gvSearchResults_Sorting
是否正確觸發? 如果沒有,請查看頁面上的AutoEventWireup屬性,它應該設置為true
因為您沒有顯式綁定事件處理程序。
否則,您是否嘗試過沒有UpdatePanel
的問題?
嗯......我對自定義分頁不太熟悉,但是......當一個事件沒有為數據綁定控件觸發時,它通常是兩件事之一:
1) 您在錯誤的時間重新綁定數據。 2) 回發頁面上的控件層次結構不相同。
由於您正在動態創建此控件,因此我將在這里使用 #2。 事實上,您可能同時遇到這兩個問題,因為您是在 OnDataBound 事件中創建控件。 這意味着創建此控件的唯一的一次是當你調用DataBind,你不應該在回發做,直到處理完事件之后。 所以你在這里給自己編寫了一個 Catch-22。
是否可以通過標記添加自定義尋呼機? 這將解決您的問題,因為這樣您就不會依賴這個動態創建的控件。 您的另一個選擇是將動態控件創建移動到 Init 事件。
如果您動態創建 GridView,它將為您省去很多麻煩:請參閱此鏈接例如,您只需要一個 DataSet,其余的將由控件完成...
你的代碼有任何 Response.Write 或 Response.WriteLine 嗎? 如果有,請刪除它。 因為它也有影響。 :D
在綁定 GridView 之前,請執行以下操作:
GridView1.PageIndexChanging += new GridViewPageEventHandler(GridView1_PageIndexChanging);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.