Пользовательский пейджинг для GridView в UpdatePanel не запускает событие PageIndexChanging - PullRequest
0 голосов
/ 17 марта 2010

У меня есть GridView, который использует пользовательский пейджинг внутри UpdatePanel (чтобы пейджинг и сортировка вида сетки не вызывали обратную передачу). Сортировка работает нормально, но подкачка - нет. Событие 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>

В приведенном ниже коде у меня есть метод SetPaging, который вызывается для события GridView OnDataBound:

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 не запускается, когда я использую пользовательский пейджинг.

Спасибо

Джеф

Ответы [ 5 ]

0 голосов
/ 16 октября 2012

Правильно ли запущены другие события, например gvSearchResults_Sorting? Если нет, посмотрите на свойство AutoEventWireup на своей странице, оно должно быть установлено на true, поскольку вы явно не связываете обработчики событий.

В противном случае, вы пытались решить проблему без UpdatePanel?

0 голосов
/ 11 апреля 2011

Есть ли у вас Response.Write или Response.WriteLine для вашего кода? Пожалуйста, удалите его, если у вас есть. Потому что это также имеет эффект. : D

0 голосов
/ 21 марта 2010

Если вы создадите GridView динамически, это избавит вас от многих хлопот: см. эту ссылку Например. все, что вам нужно, это набор данных, а все остальное будет сделано элементом управления ...

0 голосов
/ 24 марта 2011

Прежде чем связать GridView, сделайте следующее:

GridView1.PageIndexChanging += new GridViewPageEventHandler(GridView1_PageIndexChanging);
0 голосов
/ 17 марта 2010

Ну .... я не слишком знаком с пользовательской подкачкой, но ... когда событие не запускается для элемента управления с привязкой к базе данных, это обычно одна из двух вещей:

1) Вы повторно привязываете данные в неправильное время. 2) Контрольная иерархия не идентична на странице обратной передачи.

Поскольку вы создаете этот элемент управления динамически, я собираюсь перейти к # 2 здесь. Фактически у вас может быть комбинация этих двух проблем, поскольку вы создаете элементы управления в событии OnDataBound. Это означает, что единственный раз, когда создается этот элемент управления, это когда вы вызываете DataBind, что вы не должны делать при обратной передаче до после обработки событий. Итак, вы написали себе небольшой Catch-22 здесь.

Разве нельзя добавить пользовательский пейджер с помощью разметки? Это решит вашу проблему, так как тогда вы не будете полагаться на этот динамически созданный элемент управления. Другой вариант - переместить создание динамического элемента управления в событие Init.

...