2010-09-17 9 views
7

Ich möchte einen Repeater erstellen, der die Kopf-/Fußzeile basierend auf den Eigenschaften nur dann anzeigt, wenn DataSource leer ist.Wie kann ich einen benutzerdefinierten Repeater erstellen, der Header, Footer basierend auf Eigenschaften anzeigt?

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

Ich möchte auch ein EmptyTemplate erstellen, wenn die DataSource leer Anzeige ist diese Vorlage ...

Ich habe keine Ahnung, wie dies zu implementieren. Was sollte ich überschreiben, um dieses Verhalten zu erreichen?

Antwort

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); 
     } 
    } 
} 

Verbrauch:

<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

Danke! Genau das habe ich gesucht! – BrunoLM

0

Ich würde ein Web User Control (.ascx) erstellen, das Ihren Header-Abschnitt, ein [Kind] Repeater-Steuerelement und einen Fußzeilenabschnitt enthält. Sie können all Ihre Logik in dieses benutzerdefinierte Steuerelement einfügen.

-1

Wenn Sie dies mit nur einem Repeater tun möchten, können Sie dies tun:

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

und dann in Ihrem Code hinter

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

Das Problem dabei ist, dass der Repeater sein Rendering-Ereignis nicht ausgelöst wird, wenn keine Datensätze durch die Daten gebunden waren Prozess bindend. Dies ähnelt dem Problem, mit dem Sie konfrontiert werden, wenn Sie über eine benutzerdefinierte Fußzeile Datensätze in einer GridView hinzufügen möchten und keine Daten haben. –

+0

ich stehe behoben. Danke – AndreasKnudsen

2

Verwenden Listview statt Repeater. Es enthält bereits EmptyDataTemplate und EmptyItemTemplate Elemente, so dass Sie nichts tun müssen :)

0

Überschreiben Sie das Renderereignis, um den gewünschten HTML-Code basierend auf allen von Ihnen erwähnten Eigenschaften auszugeben.