2010-09-17 9 views
7

Quiero crear un repetidor que muestre el encabezado/pie de página según las propiedades, solo si el DataSource está vacío.¿Cómo puedo crear un repetidor personalizado que muestre encabezado, pie de página en función de las propiedades?

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

que también desee crear una EmptyTemplate, si el DataSource pantalla vacía es esta plantilla ...

no tengo ni idea de cómo implementar esto. ¿Qué debería anular para lograr este comportamiento?

Respuesta

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

Uso:

<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

¡Gracias! ¡Eso es exactamente lo que estaba buscando! – BrunoLM

0

Crearía un control de usuario web (.ascx) que contiene su sección de encabezado, un control de repetidor [secundario] y una sección de pie de página. Puedes poner toda tu lógica en ese control personalizado.

-1

Si usted quiere hacer esto con sólo un repetidor se puede hacer esto:

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

y luego en su código detrás

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

El problema con esto es que el repetidor no disparará su caso la representación si no hay registros fueron atados a través del proceso de vinculación de datos. Esto es similar al problema con el que se encuentra cuando quiere tener un pie de página personalizado para agregar registros en un GridView y no tiene datos. –

+0

permanezco corregido. Gracias – AndreasKnudsen

2

Uso ListView en lugar de repetidor. Ya contiene los elementos EmptyDataTemplate y EmptyItemTemplate, por lo que no es necesario que haga nada :)

0

anule el evento de renderizado para generar el HTML que desea basándose en todas las propiedades que ha mencionado.

Cuestiones relacionadas