空的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>&nbsp;&nbsp;&nbsp;&nbsp; </td> <td style="width:110px"> <asp:Label ID="storeLbl" runat="server" Text='<%# Bind("Name") %>'> </asp:Label>&nbsp;&nbsp; </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不支持通过使用FooterTemplateOnItemDataBound事件一起完成您正在做的事情的内置方法,并且仅当数据源不返回任何项目时才显示页脚。

关于如何做到这一点的例子可以在下面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,所以可能有一个更干净的方法来做到这一点。

我发现解决这个问题的最好方法是:

  1. 在页面的任何位置添加以下标签 –

     <asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label> 
  2. 为您的中继器添加OnPreRenderEvent

     <asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender"> 
  3. 现在在你的代码隐藏的这个事件里面,编写代码

     protected void emptyRepeater_PreRender(object sender, EventArgs e) { lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0); } 
  4. 现在你的空中继器应该在数据绑定之后,在页面上呈现之前进行检查,并且显示标签是否为空。

如果你不想用隐藏的元素乱扔你的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>