0

GridView を持つ非常に単純なアプリケーションがあります。ドロップダウン リストとリンク ボタンを使用するカスタム BottomPagerRow があります。デフォルトのページが表示されているときにコントロールを使用しようとすると、正常に動作しますが、ページ サイズを変更すると、他の変更によって強制的にデフォルトに戻されます。

このコードを自分で見るだけで、行番号が変更されているため、コントロールの ID が変更されており、サーバーがそれらを見つけようとすると、存在しなくなり、デフォルトに切り替わるとしか思えません。

<asp:GridView ID="dgCQMain" runat="server" EnableViewState="false" PagerSettings-Position="Bottom" OnPageIndexChanging="dgCQMain_PageIndexChanging" AutoGenerateColumns="true" OnRowCreated="dgCQMain_RowCreated">
    <HeaderStyle CssClass="gridHeaderRow" />
    <AlternatingRowStyle CssClass="gridAlternatingRows" />
    <PagerStyle CssClass="gridPager" />
    <RowStyle CssClass="gridRow" />
    <SelectedRowStyle CssClass="gridSelectedRow" />
    <FooterStyle CssClass="gridFooter" />
    <EmptyDataTemplate>
       <asp:Label ID="lblEmptyLaboratoryMain" runat="server" Text="[There are no current items for this patient]"></asp:Label>
       </EmptyDataTemplate>
       <EmptyDataRowStyle CssClass="gridEmpty" />
       <PagerTemplate>
          <table width="100%" cellpadding="0" cellspacing="0" border="0">
             <tr class="gridPager">
                <td class="pagerNumbers">
                   <asp:LinkButton CssClass="pagerNumberLinks" ID="LinkButton1" runat="server" CommandName="Page" CausesValidation="false" CommandArgument="First"><<</asp:LinkButton>
                   |
                   <asp:LinkButton CssClass="pagerNumberLinks" ID="LinkButton2" runat="server" CommandName="Page" CausesValidation="false" CommandArgument="Prev"><</asp:LinkButton>
                   |
                   <asp:Repeater ID="rptPager" runat="server">
                      <ItemTemplate>
                         <asp:LinkButton CssClass="pagerNumberLinks" ID="lnkPage" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%#Eval("Value") %>' Enabled='<%# Eval("Enabled") %>' OnClick="dgCQMainPage_Changed"></asp:LinkButton>
                         <span>|</span>
                       </ItemTemplate>
                    </asp:Repeater>
                 <asp:LinkButton CssClass="pagerNumberLinks" ID="LinkButton4" runat="server" CommandName="Page" CausesValidation="false" CommandArgument="Next">></asp:LinkButton>
                 |
                 <asp:LinkButton CssClass="pagerNumberLinks" ID="LinkButton5" runat="server" CommandName="Page" CausesValidation="false" CommandArgument="Last">>></asp:LinkButton>
                 |
               </td>
               <td class="gridPager">
                  <asp:Label ID="MessageLabel" Text="Show me" runat="server" />
                  <asp:DropDownList ID="PageDropDownList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="dgCQMainDropDownList_SelectedIndexChanged_Bottom">
                     <asp:ListItem Text="2" />
                     <asp:ListItem Text="5" />
                     <asp:ListItem Text="10" />
                  </asp:DropDownList>
                  <asp:Label ID="Label1" Text=" results per page" runat="server" />
               </td>
            </tr>
         </table>
      </PagerTemplate>
   </asp:GridView>

protected void dgCQMainDropDownList_SelectedIndexChanged_Bottom(Object sender, EventArgs e)
{
   // Set the PageIndex property to display that page selected by the user.
   dgCQMain.PageIndex = 0;
   dgCQMain.PageSize = int.Parse((sender as DropDownList).SelectedItem.Value);
}
4

1 に答える 1

0

答えは見つかりましたが、それが最善の方法であるとは言えません。ここ:

/// <summary>
/// Special method to handle the Drop down list value changing 
/// but ASP not accurately modifying the controls
/// </summary>
private void HandlePossibleBottomRowEvents()
{
    var page = associatedGridView.Page;
    var request = page.Request;

    var possibleCall = request.Form["__EventTarget"];
    if (possibleCall != null)
    {
        if (possibleCall.Contains("pagerDDL"))
        {
            var newPageSize = request[possibleCall];
            var newSize = int.Parse(newPageSize);
            if (associatedGridView.PageSize != newSize)
                UpdatePageSize(newSize);
        }
    }
}

これにより、ポストバックの原因が取得され、それが 2 つの dll (上と下の行) のいずれかであるかどうかが確認され、サイズがフォーム ポストの値に設定されます。AssociatedGridView は、私が使用しているグリッドビューです。これは、Pager として機能している ITemplate の内部にあります。

于 2013-03-12T20:01:30.097 に答える