空的Repeater控制的默认文本
使用VS 2008,我有一个Repeater控制:
<asp:Repeater runat="server" ID="storesRep" DataSourceID="storeSqlDataSource" OnItemDataBound="StoresRep_ItemDataBound"> <ItemTemplate> <table style="padding:0px"> <tr> <td style="width:200px"><asp:Label ID="infoLbl" runat="server"> Choose stores for upload:</asp:Label> </td> <td style="width:110px"> <asp:Label ID="storeLbl" runat="server" Text='<%# Bind("Name") %>'> </asp:Label> </td> <td><asp:CheckBox runat="server" ID="storeCheck" /></td> </tr> </table> </ItemTemplate> </asp:Repeater> <asp:SqlDataSource ID="storeSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:someConnectionString %>" SelectCommand="SELECT [StoreId], [Name] FROM [Store] Order By [Name]"> </asp:SqlDataSource>
现在我想显示一个默认的文本,如“没有find商店”,如果数据源从数据库中没有返回任何项目。 到目前为止,我主要使用了GridView
,因为EmptyDataText
属性没有问题。
您可以解决这个事实,即Repeater
不支持通过使用FooterTemplate
与OnItemDataBound
事件一起完成您正在做的事情的内置方法,并且仅当数据源不返回任何项目时才显示页脚。
关于如何做到这一点的例子可以在下面find:
处理ASP.NET Repeater控件中的空数据
如何在ASP.NET Repeater控件中显示空模板?
Joaos的答案甚至可以简化。 在页脚中,不要将默认项目的visible属性设置为false,而是使用以下expression式:
<FooterTemplate> <asp:Label ID="defaultItem" runat="server" Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" /> </FooterTemplate>
这样,你可以保存代码。
另一种可能性
<FooterTemplate> <asp:Label ID="lblEmptyData" runat="server" Visible='<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>' Text="No items found" /> </FooterTemplate>
这个代码片段的好处是,你不依赖于你分配给你的中继器的ID。
更好:这个子类添加一个EmptyDataTemplate属性。 在你的标记中,像元素一样放入一个元素。 默认情况下,这将隐藏页眉和页脚,如果没有数据; 你可以用标记中的HeaderVisibleWhenEmpty和FooterVisibleWhenEmpty属性来改变它。
public class RepeaterWithEmptyDataTemplate : Repeater { public virtual ITemplate EmptyDataTemplate { get; set; } protected virtual bool DefaultHeaderVisibleWhenEmpty { get { return false; } } protected virtual bool DefaultFooterVisibleWhenEmpty { get { return false; } } public bool HeaderVisibleWhenEmpty { get { return ViewState["hve"] == null ? DefaultHeaderVisibleWhenEmpty : (bool) ViewState["hve"]; } set { ViewState["hve"] = value; } } public bool FooterVisibleWhenEmpty { get { return ViewState["fve"] == null ? DefaultFooterVisibleWhenEmpty : (bool) ViewState["fve"]; } set { ViewState["fve"] = value; } } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); if (Items.Count == 0 && EmptyDataTemplate != null) { var emptyPlaceHolder = new PlaceHolder {ID = "empty", Visible = true}; EmptyDataTemplate.InstantiateIn(emptyPlaceHolder); //figure out where to put placeholder RepeaterItem footer = Controls.OfType<RepeaterItem>().FirstOrDefault(i => i.ItemType == ListItemType.Footer); if (footer == null) { //add to end if no footer Controls.Add(emptyPlaceHolder); } else { Controls.AddAt(Controls.IndexOf(footer), emptyPlaceHolder); } //hide header and footer according to properties. foreach (RepeaterItem x in Controls.OfType<RepeaterItem>()) { switch (x.ItemType) { case ListItemType.Header: x.Visible = HeaderVisibleWhenEmpty; break; case ListItemType.Footer: x.Visible = FooterVisibleWhenEmpty; break; } } } } }
标记示例:
<myprefix:RepeaterWithEmptyDataTemplate runat=server> <ItemTemplate>blah blah blah</ItemTemplate> <EmptyDataTemplate>Hey, no data!</EmptyDataTemplate> </myprefix:RepeaterWithEmptyDataTemplate>
请注意,必须调用DataBind方法,否则将不会显示emptydatatemplate。
您可以使用页脚模板来pipe理按摩,就像这样
步骤1
<FooterTemplate> <%-- Label used for showing Error Message --%> <asp:Label ID="lblDefaultMessage" runat="server" Text="Sorry, no item is there to show." Visible="false"> </asp:Label> </FooterTemplate>
第2步
在Repeater_ItemDataBound事件中处理lable的可见性
protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (Repeater.Items.Count < 1) { if (e.Item.ItemType == ListItemType.Footer) { Label lblDefaultMessage= (Label)e.Item.FindControl("lblDefaultMessage"); lblDefaultMessage.Visible = true; } } }
在答案的基础上。 3我采用了下面这个对我来说似乎很好的解决scheme:
<asp:Literal ID="emptyDataRowCnt" runat="server" Visible='<%# MyRepeater.Items.Count == 0 %>'> <li class="row emptyDataRow">No data here</li> </asp:Literal>
使用以前答案中提供的可见属性和asp文字,我扩展了erionpc的答案,以显示“无数据”或logging计数。
<FooterTemplate> <asp:Literal ID="repeaterEmptyDataRow" runat="server" Visible='<%# Results_Repeater.Items.Count == 0 %>'> <tr> <td>No Data Found</td> </tr> </asp:Literal> <asp:Literal ID="repeaterResultsDataRow1" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'> <tr> <td> </asp:Literal> <asp:Literal ID="repeaterResultsDataRow2" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>' Text='<%# String.Concat(Results_Repeater.Items.Count.ToString(), " records.") %>' /> <asp:Literal ID="repeaterResultsDataRow3" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'> </td> </tr> </asp:Literal> </table> </FooterTemplate>
我不写很多asp,所以可能有一个更干净的方法来做到这一点。
我发现解决这个问题的最好方法是:
-
在页面的任何位置添加以下标签 –
<asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>
-
为您的中继器添加OnPreRenderEvent
<asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">
-
现在在你的代码隐藏的这个事件里面,编写代码
protected void emptyRepeater_PreRender(object sender, EventArgs e) { lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0); }
-
现在你的空中继器应该在数据绑定之后,在页面上呈现之前进行检查,并且显示标签是否为空。
如果你不想用隐藏的元素乱扔你的HTML(我真的不喜欢用JS隐藏东西):
你可能已经有一个Utils静态类,它有静态属性。 (如果没有,点击解决scheme并添加 – >类)
设置公共静态stringhidden =“”; //在新build的Utils类上
在您的代码背后.cs文件做到这一点:
DataTable coll = .... if(coll.Rows.Count < 1) Utils.hidden = "<span>Sorry, there were no items</span>
然后在你的.ascx文件中, <FooterTemplate>
看起来像这样:
<FooterTemplate> <%# Utils.hidden %> </FooterTemplate>