空转发器控件的默认文本

时间:2011-03-11 10:05:03

标签: asp.net 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>

现在,如果数据源没有从数据库返回任何项目,我想显示默认文本,例如“找不到商店”。到目前为止,由于GridView属性,我大多使用EmptyDataText我没有遇到问题。

9 个答案:

答案 0 :(得分:68)

Joaos的答案甚至可以简化。在页脚中,不要将默认项的visible-property设置为false,而是使用以下表达式:

<FooterTemplate>
    <asp:Label ID="defaultItem" runat="server" 
        Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

这样,您可以保存代码。

答案 1 :(得分:29)

另一种可能性:

<FooterTemplate>
    <asp:Label ID="lblEmptyData" runat="server" Visible='<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

此代码段的好处是您不依赖于分配给转发器的ID。

答案 2 :(得分:27)

您可以通过将RepeaterFooterTemplate事件结合使用并仅在显示页脚时,OnItemDataBound不支持内置方式来完成您正在执行的操作这一事实数据源不返回任何项目。

有关如何执行此操作的示例,请访问:

Handling Empty Data in an ASP.NET Repeater control

How to show Empty Template in ASP.NET Repeater control?

答案 3 :(得分:5)

更好:这个子类添加了一个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。

答案 4 :(得分:1)

您可以使用页脚模板管理按摩,例如

第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事件中的标签的可见性,如

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;
    }
  }
}

答案 5 :(得分:0)

根据答案n。 3我采用了以下对我来说似乎足够好的解决方案:

<asp:Literal ID="emptyDataRowCnt" runat="server" Visible='<%# MyRepeater.Items.Count == 0 %>'>
    <li class="row emptyDataRow">No data here</li>
</asp:Literal>

答案 6 :(得分:0)

使用前面答案中提供的可见属性和asp文字,我将erionpc的答案扩展为显示“无数据”或记录计数。

<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,所以可能有更简洁的方法来做到这一点。

答案 7 :(得分:0)

我找到解决此问题的最佳方式:

  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. 现在,您应该在数据绑定之后但在页面上呈现之前检查空转发器,并在标签为空时显示该标签。

答案 8 :(得分:-1)

如果您不想使用隐藏元素丢弃HTML(我真的不喜欢用JS隐藏内容):

您可能已经拥有一个包含静态属性的Utils静态类。 (如果没有,请单击解决方案并添加 - &gt;类)

设置public static String hidden =“”; //在新创建的Utils类

在.cs文件后面的代码上执行以下操作:

DataTable coll = ....
if(coll.Rows.Count < 1)
   Utils.hidden = "<span>Sorry, there were no items</span>

然后在您的.ascx文件中,<FooterTemplate>如下所示:

<FooterTemplate>
   <%# Utils.hidden %>
</FooterTemplate>