簡體   English   中英

UpdatePanel 中 GridView 的自定義分頁不觸發 PageIndexChanging 事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM