tag route net for data asp all asp.net repeater

asp.net - route - tag helpers asp net core



Texto predeterminado para el control de repetidor vacĂ­o (9)

Aún mejor: esta subclase agrega una propiedad EmptyDataTemplate. En su marca, ponga un elemento tal como lo haría con un elemento. Por defecto, esto ocultará el encabezado y el pie de página si no hay datos; puede cambiar esto con las propiedades HeaderVisibleWhenEmpty y FooterVisibleWhenEmpty en el marcado.

public class RepeaterWithEmptyDataTemplate : Repeater { public virtual ITemplate EmptyDataTemplate { get; set; } protected virtual bool DefaultHeaderVisibleWhenEmpty { get { return false; } } protected virtual bool DefaultFooterVisibleWhenEmpty { get { return false; } } public bool HeaderVisibleWhenEmpty { get { return ViewState["hve"] == null ? DefaultHeaderVisibleWhenEmpty : (bool) ViewState["hve"]; } set { ViewState["hve"] = value; } } public bool FooterVisibleWhenEmpty { get { return ViewState["fve"] == null ? DefaultFooterVisibleWhenEmpty : (bool) ViewState["fve"]; } set { ViewState["fve"] = value; } } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); if (Items.Count == 0 && EmptyDataTemplate != null) { var emptyPlaceHolder = new PlaceHolder {ID = "empty", Visible = true}; EmptyDataTemplate.InstantiateIn(emptyPlaceHolder); //figure out where to put placeholder RepeaterItem footer = Controls.OfType<RepeaterItem>().FirstOrDefault(i => i.ItemType == ListItemType.Footer); if (footer == null) { //add to end if no footer Controls.Add(emptyPlaceHolder); } else { Controls.AddAt(Controls.IndexOf(footer), emptyPlaceHolder); } //hide header and footer according to properties. foreach (RepeaterItem x in Controls.OfType<RepeaterItem>()) { switch (x.ItemType) { case ListItemType.Header: x.Visible = HeaderVisibleWhenEmpty; break; case ListItemType.Footer: x.Visible = FooterVisibleWhenEmpty; break; } } } } }

Muestra en marcado:

<myprefix:RepeaterWithEmptyDataTemplate runat=server> <ItemTemplate>blah blah blah</ItemTemplate> <EmptyDataTemplate>Hey, no data!</EmptyDataTemplate> </myprefix:RepeaterWithEmptyDataTemplate>

Tenga en cuenta que se debe llamar al método DataBind o no se mostrará la plantilla vacía.

Usando VS 2008, tengo un control de repetidor:

<asp:Repeater runat="server" ID="storesRep" DataSourceID="storeSqlDataSource" OnItemDataBound="StoresRep_ItemDataBound"> <ItemTemplate> <table style="padding:0px"> <tr> <td style="width:200px"><asp:Label ID="infoLbl" runat="server"> Choose stores for upload:</asp:Label>&nbsp;&nbsp;&nbsp;&nbsp; </td> <td style="width:110px"> <asp:Label ID="storeLbl" runat="server" Text=''<%# Bind("Name") %>''> </asp:Label>&nbsp;&nbsp; </td> <td><asp:CheckBox runat="server" ID="storeCheck" /></td> </tr> </table> </ItemTemplate> </asp:Repeater> <asp:SqlDataSource ID="storeSqlDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:someConnectionString %>" SelectCommand="SELECT [StoreId], [Name] FROM [Store] Order By [Name]"> </asp:SqlDataSource>

Ahora me gustaría mostrar un texto predeterminado como "No se encontraron tiendas" si el origen de datos no devuelve elementos de la base de datos. Hasta ahora, en su mayoría he usado GridView donde no tuve problemas debido al atributo EmptyDataText .


La mejor manera que encontré para resolver esto:

  1. Agregue la siguiente etiqueta en cualquier lugar de su página:

    <asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>

  2. Agregue el OnPreRenderEvent para su repetidor

    <asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">

  3. Ahora, dentro de este evento en tu código, escribe el código

    protected void emptyRepeater_PreRender(object sender, EventArgs e) { lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0); }

  4. Ahora debe revisar su repetidor vacío después de que los datos estén vinculados pero antes de renderizar en la página, y mostrar la etiqueta si está vacía.


La respuesta de Joaos puede incluso ser simplificada. En el pie de página, no establezca la propiedad visible de su elemento predeterminado en falso, pero use la siguiente expresión:

<FooterTemplate> <asp:Label ID="defaultItem" runat="server" Visible=''<%# YourRepeater.Items.Count == 0 %>'' Text="No items found" /> </FooterTemplate>

De esta manera, puede guardar el código detrás.


Otra posibilidad:

<FooterTemplate> <asp:Label ID="lblEmptyData" runat="server" Visible=''<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>'' Text="No items found" /> </FooterTemplate>

El beneficio de este fragmento de código es que no depende de la ID que asignó a su repetidor.



Puede utilizar una plantilla de pie de página para gestionar el masaje, como este

Paso 1

<FooterTemplate> <%-- Label used for showing Error Message --%> <asp:Label ID="lblDefaultMessage" runat="server" Text="Sorry, no item is there to show." Visible="false"> </asp:Label> </FooterTemplate>

Paso 2

Manejar la visibilidad de la etiqueta en el evento Repeater_ItemDataBound como

protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (Repeater.Items.Count < 1) { if (e.Item.ItemType == ListItemType.Footer) { Label lblDefaultMessage= (Label)e.Item.FindControl("lblDefaultMessage"); lblDefaultMessage.Visible = true; } } }


Si no quieres ensuciar tu HTML con elementos ocultos (realmente no me gusta esconder cosas con JS):

Probablemente ya tenga una clase estática de Utils que tiene propiedades estáticas en ella. (Si no es así, haga clic en la solución y agregue -> clase)

Establecer una cadena estática pública oculta = ""; // en la nueva clase de Utils creada

En su código detrás del archivo .cs haga esto:

DataTable coll = .... if(coll.Rows.Count < 1) Utils.hidden = "<span>Sorry, there were no items</span>

Luego, en su archivo .ascx, la <FooterTemplate> ve así:

<FooterTemplate> <%# Utils.hidden %> </FooterTemplate>


Sobre la base de la respuesta n. 3 Adopté la siguiente solución que me parece lo suficientemente buena:

<asp:Literal ID="emptyDataRowCnt" runat="server" Visible=''<%# MyRepeater.Items.Count == 0 %>''> <li class="row emptyDataRow">No data here</li> </asp:Literal>


Usando las propiedades visibles y los literales de asp proporcionados en las respuestas anteriores, extendí la respuesta de erionpc para mostrar un ''no datos'' o un conteo de registros.

<FooterTemplate> <asp:Literal ID="repeaterEmptyDataRow" runat="server" Visible=''<%# Results_Repeater.Items.Count == 0 %>''> <tr> <td>No Data Found</td> </tr> </asp:Literal> <asp:Literal ID="repeaterResultsDataRow1" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>''> <tr> <td> </asp:Literal> <asp:Literal ID="repeaterResultsDataRow2" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>'' Text=''<%# String.Concat(Results_Repeater.Items.Count.ToString(), " records.") %>'' /> <asp:Literal ID="repeaterResultsDataRow3" runat="server" Visible=''<%# Results_Repeater.Items.Count != 0 %>''> </td> </tr> </asp:Literal> </table> </FooterTemplate>

No escribo mucho asp, así que quizás haya una forma más limpia de hacer esto.