如何创建基于属性显示页眉,页脚的自定义中继器?
我想创建一个基于属性显示页眉/页脚的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\">{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); } } }
用法:
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; } ... }