How can I create a custom Repeater that displays Header, Footer based on properties?

后端 未结 5 1585
长情又很酷
长情又很酷 2021-02-09 07:19

I want to create a Repeater that displays the header/footer based on properties, only if the DataSource is empty.

public class Repeater : System.Web         


        
相关标签:
5条回答
  • 2021-02-09 07:37

    Use ListView instead of Repeater. It already contains EmptyDataTemplate and EmptyItemTemplate elements so you don't need to do anything :)

    0 讨论(0)
  • 2021-02-09 07:42

    If you want to do this with just a repeater you can do this:

        <asp:Repeater runat="server" OnItemDataBound="ShowHideHeaderFooter">
        <HeaderTemplate>
            <asp:PlaceHolder runat="server" ID="PlaceHolderHeader">
                HEADER STUFF
            </asp:PlaceHolder>
        </HeaderTemplate>
        <ItemTemplate>
            ITEM STUFF
        </ItemTemplate>
        <FooterTemplate>
            <asp:PlaceHolder runat="server" ID="PlaceHolderFooter">
                FOOTER STUFF
            </asp:PlaceHolder>
        </FooterTemplate>
    </asp:Repeater>
    

    and then in your code behind

        protected void ShowHideHeaderFooter(object sender, RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Header && theDataSource.Count == 0 && !ShowHeaderOnEmpty)
            {
                e.Item.FindControl("PlaceHolderHeader").Visible = false;
            }
            ...
        }
    
    0 讨论(0)
  • 2021-02-09 07:42

    override the render event to output the HTML you want based on the all properties you have mentioned.

    0 讨论(0)
  • 2021-02-09 07:43

    I would create a Web User Control (.ascx) that contains your header section, a [child] repeater control, and a footer section. You can put all your logic in that custom control.

    0 讨论(0)
  • 2021-02-09 07:46
    [ToolboxData("<{0}:SmartRepeater runat=\"server\"></{0}:SmartRepeater>")]
    public partial class SmartRepeater : Repeater
    {
        public bool ShowHeaderOnEmpty { get; set; }
        public bool ShowFooterOnEmpty { get; set; }
    
        private ITemplate emptyTemplate = null;
    
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate EmptyTemplate
        {
            get { return this.emptyTemplate; }
            set { this.emptyTemplate = value; }
        }
    
        protected override void OnDataBinding(EventArgs e)
        {
            base.OnDataBinding(e);
            if (this.Items.Count == 0)
            {
                this.Controls.Clear();
    
                if (this.HeaderTemplate != null && ShowHeaderOnEmpty)
                    this.HeaderTemplate.InstantiateIn(this);
    
                if (this.EmptyTemplate!=null)
                    this.EmptyTemplate.InstantiateIn(this);
    
                if (this.FooterTemplate != null && ShowFooterOnEmpty)
                    this.FooterTemplate.InstantiateIn(this);
            }
        }
    }
    

    Usage:

    <UC:SmartRepeater ID="rep" runat="server" ShowHeaderOnEmpty="true" ShowFooterOnEmpty="true">
        <HeaderTemplate>HEADER</HeaderTemplate>
        <ItemTemplate>Item</ItemTemplate>
        <SeparatorTemplate>, </SeparatorTemplate>
        <EmptyTemplate><b>Nothing</b></EmptyTemplate>
        <FooterTemplate>FOOTER</FooterTemplate>
    </UC:SmartRepeater>
    
    0 讨论(0)
提交回复
热议问题