2010-09-17 7 views
7

Je souhaite créer un répéteur qui affiche l'en-tête/pied de page en fonction des propriétés, uniquement si le DataSource est vide.Comment créer un répéteur personnalisé affichant en-tête, pied de page en fonction des propriétés?

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

Je veux aussi créer un EmptyTemplate, si le DataSource est vide écran ce modèle ...

Je ne sais pas sur la façon de mettre en œuvre. Que devrais-je remplacer pour atteindre ce comportement?

Répondre

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

Utilisation:

<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

Merci! C'est exactement ce que je cherchais! – BrunoLM

0

Je créer un contrôle d'utilisateur Web (.ascx) qui contient votre section d'en-tête, un contrôle de répéteur [enfant] et une section de pied de page. Vous pouvez mettre toute votre logique dans ce contrôle personnalisé.

-1

Si vous voulez faire avec juste un répéteur que vous pouvez faire ceci:

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

puis dans votre code derrière

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

Le problème est que le répéteur ne se déclenche pas son événement de rendu si aucun enregistrement n'a été lié par les données processus de liaison. Ceci est similaire au problème que vous rencontrez lorsque vous voulez avoir un pied de page personnalisé pour ajouter des enregistrements dans un GridView et vous n'avez aucune donnée. –

+0

je suis corrigé. Merci – AndreasKnudsen

2

Utilisation ListView au lieu de répéteur. Il contient déjà des éléments EmptyDataTemplate et EmptyItemTemplate pour que vous n'ayez rien à faire :)

0

substituez l'événement render pour afficher le code HTML souhaité en fonction de toutes les propriétés que vous avez mentionnées.