Comment créer un répéteur personnalisé qui affiche l’en-tête, le pied de page en fonction des propriétés?

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

 public class Repeater : System.Web.UI.WebControls.Repeater { public bool ShowHeaderOnEmpty { get; set; } public bool ShowFooterOnEmpty { get; set; } [DefaultValue((ssortingng)null), PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(System.Web.UI.WebControls.RepeaterItem)), Browsable(false)] public ITemplate EmptyTemplate { get; set; } } 

Je souhaite également créer un EmptyTemplate , si la EmptyTemplate DataSource est vide, affichez ce modèle …

Je n’ai aucune idée sur la façon de mettre en œuvre cela. Que devrais-je remplacer pour obtenir ce comportement?

 [ToolboxData("<{0}:SmartRepeater runat=\"server\">")] 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:

  HEADER Item ,  Nothing FOOTER  

Utilisez ListView au lieu de Repeater. Il contient déjà des éléments EmptyDataTemplate et EmptyItemTemplate, vous n’avez donc rien à faire 🙂

Je créerais un contrôle utilisateur Web (.ascx) contenant 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é.

remplacez l’événement de rendu pour générer le code HTML souhaité en fonction de toutes les propriétés que vous avez mentionnées.

Si vous voulez faire cela avec seulement un répéteur, vous pouvez le faire:

     HEADER STUFF    ITEM STUFF    FOOTER STUFF    

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