填充数据源,列表视图绑定但显示 EmptyDataTemplate
Posted
技术标签:
【中文标题】填充数据源,列表视图绑定但显示 EmptyDataTemplate【英文标题】:DataSource populated, listview binds but show EmptyDataTemplate 【发布时间】:2012-05-18 03:38:31 【问题描述】:我在使用 C# asp.net listview 时遇到了这个奇怪的问题,我无法确定确切的原因和问题。这是场景
我有一个使用 AutoCompleteExtender 的搜索文本框。在 PageLoad() 中,列表视图将填充从 DataTable 中提取的一堆数据。当有人在文本框中输入内容时,从 webservice 获取结果,将结果填充到 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="|<< " />
<asp:NumericPagerField ButtonCount="10" />
<asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" >>|" />
</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;
【问题讨论】:
你能把你的 html 标记和代码贴在后面吗?? 添加了代码。您对问题所在的初步看法是什么? 何时调用此createTable
?
每次调用 web 服务时都会调用 createTable - 当 web 服务返回结果时。
你在查询字符串中使用pageindex吗?
【参考方案1】:
我认为 getWeb(productkey);应该在“if(!PostBack)”之外调用,因为更改页面会创建回发(不是新的 Get),因此您的表将为空(或者至少这是它在网格中的工作方式)。
【讨论】:
但是如果getWeb(productkey);
在if(!PostBack)
之外被调用,那么productkey
将是未分配的变量。
老实说,我希望该表在 bindtoList 函数中为空。至少我会知道要寻找什么。但问题在于传递的DataTable不为null。我能够从 bindtoList 函数中的 DataTable prodTab 中提取数据【参考方案2】:
我找到了一个解决方法,也许是一个愚蠢的解决方法,因为它并不能真正解决问题的真正原因。
解决方法如下:
由于列表视图只会在现有列表位于 PagerNumber=1 时显示搜索结果,因此我使用 DataPager.SetPageProperties(0, DataPager.PageSize, true) 重置了 DataPager。那行得通!
我仍然很困惑为什么我会遇到这个问题......
无论如何,谢谢大家的帮助。
【讨论】:
【参考方案3】:我认为您需要从 DataPager
中删除 QueryStringField="pageNumber"
。
问题是当您从第 1 页搜索任何内容时。 x 如果结果少于 x 页,则列表视图显示空数据模板。
但如果结果有 x 或更多页,则列表视图会显示包含在页号中的结果。 X。
当您的搜索结果 x 或更多页时,如果您更改包含 listview 的新结果中的任何页面,则 listview 的数据源将更改为初始数据源。
如果您删除 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="|<< " />
<asp:NumericPagerField ButtonCount="10" />
<asp:NextPreviousPagerField ButtonType="Image" ShowLastPageButton="true" ShowNextPageButton="false" ShowPreviousPageButton="false" LastPageText=" >>|" />
</Fields>
</asp:DataPager>
</td>
</tr>
</table>
</LayoutTemplate>
【讨论】:
删除 QueryStringField 后,我无法移动到不同的页面。没有它,DataPager 似乎无法工作。我错过了什么吗?以上是关于填充数据源,列表视图绑定但显示 EmptyDataTemplate的主要内容,如果未能解决你的问题,请参考以下文章
Android,从 MySQL 读取数据后,屏幕显示关闭后填充列表视图