我想创建一个基于属性显示页眉/页脚的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
为空,则显示此模板...
我不知道如何实现这一点。我应该覆盖什么来实现这种行为?
答案 0 :(得分:4)
[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>
答案 1 :(得分:2)
使用ListView而不是Repeater。 它已经包含EmptyDataTemplate和EmptyItemTemplate元素,因此您无需执行任何操作:)
答案 2 :(得分:0)
我会创建一个Web用户控件(.ascx),其中包含您的标题部分,[子]转发器控件和页脚部分。您可以将所有逻辑放在该自定义控件中。
答案 3 :(得分:0)
覆盖render事件,根据您提到的所有属性输出所需的HTML。
答案 4 :(得分:-1)
如果您只想使用转发器执行此操作,则可以执行此操作:
<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;
}
...
}