代码之家  ›  专栏  ›  技术社区  ›  BrunoLM

如何创建基于属性显示页眉、页脚的自定义转发器?

  •  7
  • BrunoLM  · 技术社区  · 14 年前

    我想创建一个转发器,它根据属性显示页眉/页脚,仅当 DataSource 是空的。

    public class Repeater : System.Web.UI.WebControls.Repeater
    {
        public bool ShowHeaderOnEmpty { get; set; }
        public bool ShowFooterOnEmpty { get; set; }
    
        [DefaultValue((string)null),
        PersistenceMode(PersistenceMode.InnerProperty),
        TemplateContainer(typeof(System.Web.UI.WebControls.RepeaterItem)),
        Browsable(false)]
        public ITemplate EmptyTemplate { get; set; }
    }
    

    我还想创建一个 EmptyTemplate ,如果 数据来源 为空显示此模板…

    我不知道如何实现这一点。我应该重写什么来实现这种行为?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Pavlo Neiman    14 年前
    [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);
            }
        }
    }
    

    用途:

    <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>
    
        2
  •  2
  •   Alexey Raga    14 年前

    使用listview而不是repeater。 它已经包含EmptyDataTemplate和EmptyItemTemplate元素,因此您不需要执行任何操作:)

        3
  •  0
  •   CodingGorilla    14 年前

    我将创建一个Web用户控件(.ascx),其中包含您的头部分、一个[子]转发器控件和一个页脚部分。您可以将所有逻辑放入该自定义控件中。

        4
  •  0
  •   Vinay B R    14 年前

    重写呈现事件以根据您提到的所有属性输出所需的HTML。

        5
  •  -1
  •   AndreasKnudsen    14 年前

    如果只想用中继器进行此操作,可以执行以下操作:

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

    然后在你的代码后面

        protected void ShowHideHeaderFooter(object sender, RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Header && theDataSource.Count == 0 && !ShowHeaderOnEmpty)
            {
                e.Item.FindControl("PlaceHolderHeader").Visible = false;
            }
            ...
        }
    
    推荐文章