如何创建基于属性显示页眉,页脚的自定义中继器?

我想创建一个基于属性显示页眉/页脚的Repeater,仅当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 ,如果DataSource为空则显示此模板…

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

 [ToolboxData("<{0}:SmartRepeater runat=\"server\">")] 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); } } } 

用法:

  HEADER Item ,  Nothing FOOTER  

使用ListView而不是Repeater。 它已经包含EmptyDataTemplate和EmptyItemTemplate元素,因此您不需要做任何事情:)

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

覆盖render事件,根据您提到的所有属性输出所需的HTML。

如果您只想使用转发器执行此操作,则可以执行以下操作:

     HEADER STUFF    ITEM STUFF    FOOTER STUFF    

然后在你的代码后面

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