2010-09-17 7 views
7

Desidero creare un ripetitore che visualizzi l'intestazione/il piè di pagina in base alle proprietà, solo se lo DataSource è vuoto.Come posso creare un ripetitore personalizzato che visualizza Intestazione, Piè di pagina in base alle proprietà?

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

ho anche voler creare un EmptyTemplate, se il DataSource è schermo vuoto questo modello ...

Non ho idea su come implementare questo. Cosa devo ignorare per ottenere questo comportamento?

risposta

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

Usage:

<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

Grazie! Questo è esattamente quello che stavo cercando! – BrunoLM

0

Vorrei creare un controllo utente Web (.ascx) che contenga la sezione dell'intestazione, un controllo ripetitore [figlio] e una sezione del piè di pagina. Puoi mettere tutta la tua logica in quel controllo personalizzato.

-1

Se si vuole fare questo con un semplice ripetitore si può fare questo:

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

e poi nel codice dietro

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

Il problema di questo è che il ripetitore non verrà generato l'evento di rendering se nessun record erano legati attraverso i dati di processo vincolanti. Questo è simile al problema che si incontra quando si desidera avere un piè di pagina personalizzato per aggiungere record in un GridView e non si hanno dati. –

+0

sono corretto. Grazie – AndreasKnudsen

2

Uso ListView invece di ripetitore. Esso contiene già elementi EmptyDataTemplate e EmptyItemTemplate quindi non è necessario fare nulla :)

0

sostituire l'evento di rendering per generare l'HTML desiderato in base a tutte le proprietà menzionate.