0

C# asp.net リストビューでこの奇妙な問題が発生しており、正確な原因と問題を特定できません。これがシナリオです

AutoCompleteExtender を使用する検索テキスト ボックスがあります。PageLoad() で、リストビューには DataTable から抽出された一連のデータが取り込まれます。誰かがテキストボックスに何かを入力すると、Web サービスから結果を取得し、結果を DataTable に入力すると、リストビューが DataTable にバインドされます。

すべて正常に動作します - listview は、DataPager が最初に正常に動作する状態で正常にバインドします。リストビューの最初のページで、ユーザーが検索を入力すると、リストビューがバインドされ、新しい結果が表示されます。

ただし、2 ページ目以降の場合、リストビューはバインドされますが、EmptyDataTemplate が表示されます。DataTable を確認したところ、listview.DataBind の前に新しいデータが取り込まれていることがわかりました。この問題は、リストビューのページ 1 から離れたときにのみ発生します。

ASPX

<asp:ListView ID="productList" runat="server" onitemcommand="productList_ItemCommand" DataKeyNames="PrimaryID">

             <LayoutTemplate>
          <table>
            <tr runat="server">
              <th runat="server">Actions</th>
              <th runat="server">PrimaryID</th>
               <th runat="server">Product</th>
            <th runat="server">Description</th>
            </tr>
            <tr runat="server" id="itemPlaceholder" />
          </table>
        <asp:DataPager runat="server" ID="productDataPager" PageSize="20" PagedControlID="productList" QueryStringField="pageNumber">
            <Fields>
               <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" FirstPageText="|&lt;&lt; " />
                <asp:NumericPagerField ButtonCount="10" />
                <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" &gt;&gt;|" />

            </Fields>
          </asp:DataPager>     
       </LayoutTemplate>

         <ItemTemplate>
          <tr id="Tr1" class="even" runat="server">
            <td>
              <asp:LinkButton ID="EditButton" runat="Server" Text="Edit" CommandName="Edit_product"/>
            </td>

            <td">
              <asp:Label ID="primarylbl" runat="Server" Text='<%#Bind("PrimaryID") %>' />
            </td>
            <td>
              <asp:Label ID="productlbl" runat="Server" Text='<%#Bind("Product") %>' />
            </td>
             <td>
              <asp:Label ID="descriptionlbl" runat="Server" Text='<%#Bind("Description") %>' />            </td>
            </tr>
        </ItemTemplate>
       <AlternatingItemTemplate>
        <tr id="Tr1" class="odd" runat="server">
            <td>
              <asp:LinkButton ID="EditButton" runat="Server" Text="Edit" CommandName="Edit_product"/>
            </td>

            <td>
              <asp:Label ID="primarylbl" runat="Server" Text='<%#Bind("PrimaryID") %>' />
            </td>
            <td>
              <asp:Label ID="productlbl" runat="Server" Text='<%#Bind("Product") %>' />
            </td>
             <td>
              <asp:Label ID="descriptionlbl" runat="Server" Text='<%#Bind("Description")  %>' />
            </td>
            </tr>

       </AlternatingItemTemplate>

         <EmptyDataTemplate>
       No Records Found
       </EmptyDataTemplate>
           </asp:ListView>

コードビハインド

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string productkey = "0";
                getWeb(productkey); //call WebService to get all Products

             }

        }

   private void createTable(Products[] product)
        {


            DataTable productTable = new DataTable();
            productTable.Columns.Add(new DataColumn("PrimaryID", typeof(string)));
            prouctTable.Columns.Add(new DataColumn("Product", typeof(string)));
            productTable.Columns.Add(new DataColumn("Description", typeof(string)));

            for (int i = 0; i < product.Length; i++)
            {

                DataRow dr = productTable.NewRow();
                dr["PrimaryID"] = product[i].PrimaryID.ToString();
                dr["Product"] = product[i].Product.ToString();
                dr["Description"] product[i].Description.ToString();


                productTable.Rows.Add(dr);
                productTable.AcceptChanges();
            }


            bindtoList(productTable);

 protected void bindtoList(DataTable prodTab)
        {
            if (productList.DataSource == null)
            {
                productList.DataSource = prodTab;
                productList.DataBind();

                Updatepanel1.Update();
            }
            else
            {
                productList.DataSource = null;
                productList.DataSource = proTab;
                productList.DataBind();
            }


            if (prodTab.Rows.Count > 20)
            {
                ((DataPager)productList.FindControl("productDataPager")).Visible = true;
            }
            else
            {

                if (((DataPager)productList.FindControl("productDataPager")) != null && ((DataPager)productList.FindControl("productDataPager")).Visible == true)
                {
                    ((DataPager)productList.FindControl("productDataPager")).Visible = false;
                }
            }

        }
4

3 に答える 3

0

getWeb(productkey);だと思います。ページを変更するとポストバック(新しいGetではない)が作成されるため、「if(!PostBack)」の外部で呼び出す必要があります。そのため、テーブルはnullになります(または、少なくともこれがグリッドでの動作方法です)。

于 2012-05-18T11:02:08.410 に答える
0

問題の本当の原因を実際に解決しないため、おそらくばかげた回避策を見つけました。

回避策は次のとおりです。

既存のリストが PagerNumber=1 の場合、リストビューは検索結果のみを表示するため、DataPager.SetPageProperties(0, DataPager.PageSize, true) を使用して DataPager をリセットしました。それはうまくいきました!

そもそもなぜこの問題が発生しているのか、私はまだ困惑しています...

とにかく、助けてくれてありがとう。

于 2012-05-18T11:42:03.723 に答える
0

QueryStringField="pageNumber"から削除する必要があると思いますDataPager

問題は、ページ番号から何かを検索するときです。x 結果が x ページ未満の場合、リスト ビューには空のデータ テンプレートが表示されます。

ただし、結果にxページ以上のリストビューがある場合、ページ番号に含まれる結果が表示されます。バツ。

また、検索結果が x ページ以上の場合、リストビューを含む新しい結果のいずれかのページを変更すると、リストビューのデータソースが最初のものに変更されます。

そのQueryStringField="pageNumber"部分を取り除けば、問題は解決します。

編集
これをあなたの<LayoutTemplate>

<LayoutTemplate>
          <table>
            <tr runat="server">
              <th runat="server">Actions</th>
              <th runat="server">PrimaryID</th>
               <th runat="server">Product</th>
            <th runat="server">Description</th>
            </tr>
                                <tr ID="itemPlaceholder" runat="server">
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr runat="server">
                        <td runat="server">
                            <asp:DataPager ID="DataPager1" runat="server" pagesize="20">
                                <Fields>
               <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" FirstPageText="|&lt;&lt; " />
                <asp:NumericPagerField ButtonCount="10" />
                <asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" &gt;&gt;|" />

            </Fields>
                            </asp:DataPager>
                        </td>
                    </tr>
                </table>
            </LayoutTemplate>
于 2012-05-18T09:13:52.520 に答える