0

我在使用 C# asp.net listview 时遇到了这个奇怪的问题,我无法确定确切的原因和问题。这是场景

我有一个使用 AutoCompleteExtender 的搜索文本框。在 PageLoad() 中,列表视图将填充从 DataTable 中提取的一堆数据。当有人在文本框中输入内容时,从 web 服务获取结果,将结果填充到 DataTable 中,listview 将绑定到 DataTable。

一切正常 - listview 绑定正常,DataPager 最初工作正常。在列表视图的第一页,如果用户输入搜索,列表视图将绑定并显示新结果。

但是,当我在第二页或更多时,listview 绑定但显示 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); 应该在“if(!PostBack)”之外调用,因为更改页面会创建回发(不是新的 Get),因此您的表将为空(或者至少这是它在网格中的工作方式)。

于 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.

问题是当您从第 1 页搜索任何内容时。x 如果结果少于 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 回答