0

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 イベントが発生しない理由がわかりません。

ありがとう、

ジェフ

4

5 に答える 5

0

GridView を動的に作成すると、多くの手間が省けます:このリンクを参照してください。 たとえば、必要なのは DataSet だけで、残りはコントロールによって行われます ...

于 2010-03-21T20:05:07.617 に答える
0

うーん....私はカスタム ページングにあまり詳しくありませんが、...データ バインドされたコントロールに対してイベントが発生しない場合、通常は次の 2 つのいずれかです。

1) 不適切な時間に再データバインディングを行っています。2) ポストバック ページのコントロール階層が同一ではありません。

このコントロールを動的に作成しているので、ここでは #2 を使用します。実際、OnDataBound イベントでコントロールを作成しているため、これら 2 つの問題が組み合わさっている可能性があります。つまり、このコントロールが作成されるのは DataBind を呼び出すときだけです。これは、イベントを処理するまでポストバックで行うべきではありません。ここで、Catch-22 を少しコーディングしました。

マークアップを介してカスタム ページャーを追加することはできませんか? この動的に作成されたコントロールに依存しないため、これで問題が解決します。他のオプションは、動的コントロールの作成を Init イベントに移動することです。

于 2010-03-17T06:14:57.950 に答える
0

他のイベントはgvSearchResults_Sorting正しく発生していますか? そうでない場合は、ページのAutoEventWireupプロパティを見てくださいtrue。イベント ハンドラーを明示的にバインドしていないため、に設定する必要があります。

それ以外の場合は、なしで問題を試しましたUpdatePanelか?

于 2012-10-16T05:57:48.233 に答える
0

コードに Response.Write または Response.WriteLine がありますか? ある場合は削除してください。効果もあるから。:D

于 2011-04-11T08:31:54.063 に答える
-1

GridView をバインドする前に、次の操作を行います。

GridView1.PageIndexChanging += new GridViewPageEventHandler(GridView1_PageIndexChanging);
于 2011-03-24T20:54:00.700 に答える