空转发器控件的默认文本

AGu*_*ald 50 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>
Run Code Online (Sandbox Code Playgroud)

现在,如果数据源没有从数据库返回任何项目,我想显示默认文本,如"找不到商店".到目前为止,我主要使用的GridView是因为EmptyDataText属性而没有问题的地方.

AGu*_*ald 75

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

<FooterTemplate>
    <asp:Label ID="defaultItem" runat="server" 
        Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>
Run Code Online (Sandbox Code Playgroud)

这样,您可以保存代码.


bre*_*eez 30

另一种可能性

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

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


Joã*_*elo 27

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

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

处理ASP.NET Repeater控件中的空数据

如何在ASP.NET Repeater控件中显示空模板?


Xav*_*r J 6

更好的是:这个子类添加了一个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;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

标记示例:

<myprefix:RepeaterWithEmptyDataTemplate runat=server>
    <ItemTemplate>blah blah blah</ItemTemplate>
    <EmptyDataTemplate>Hey, no data!</EmptyDataTemplate>
</myprefix:RepeaterWithEmptyDataTemplate>  
Run Code Online (Sandbox Code Playgroud)

请注意,必须调用DataBind方法,否则不会显示emptydatatemplate.