paginar - ¿Cómo puedo ocultar un repetidor en ASP.NET C#si DataSource no contiene elementos?
repeater asp net ejemplo (9)
Cuando ejecute su consulta LINQ, verifique su propiedad Count (proporcionando una lista de algún tipo). Si es 0, simplemente convierta la propiedad Visible en falso.
Tengo una página ASP.NET que usa un repetidor anidado en otro repetidor para generar una lista de datos. Es para el efecto de lo siguiente:
<asp:Repeater>
<ItemTemplate>
<span><%#Eval("Data1") %></span>
<!-- and many more -->
<asp:Repeater DataSource=''<%#Eval("Data2")%>''>
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%#Container.DataItem%></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
En el código subyacente (C #) básicamente estoy usando LINQ para extraer una lista de información de un documento XML y unir esa información al primer repetidor.
Buscando la respuesta a esto, parece que el método es determinar si los datos para el repetidor anidado están vacíos. Si es así, entonces establece la visibilidad del repetidor en falso.
Desafortunadamente, no he podido determinar cómo hacerlo en línea y no en el código subyacente (ya que no necesariamente funcionará para lo que estoy haciendo).
Dado que mis páginas no son validadas ahora, porque el UL termina vacío para cualquier elemento sin Data2, y porque me gustaría seguir usando una lista desordenada, busco su ayuda.
¿Algunas ideas?
¡Gracias!
ACTUALIZAR:
Si ayuda, ya que podría ser posible hacerlo en el código subyacente, el LINQ es algo en este sentido:
var x = from y in z
select new {
Data1 = d,
// etcetera
Data2 = (from j in k
where j.Value != String.Empty
select j.Value).ToList()
};
blah.DataSource = x;
blah.DataBind();
Por lo que sé, debes hacerlo a través del código subyacente, solo usa el evento ItemDataBound para manejarlo, puedes dejar casi todo como está, simplemente ingresa alguna lógica que obtiene el conjunto de datos y determina si tiene entradas, si no oculta el repetidor
Pruebe algo como:
<asp:Repeater runat="server" DataSource=''<%#Eval("Data2")%>''
Visible=''<%# ((IEnumerable)Eval("Data2")).GetEnumerator().MoveNext() %>''>
para el repetidor anidado
No creo que lo que está haciendo funcione, me sale un error cuando intento configurar el DataSource como intenta hacer; sin embargo, en el código que está detrás de usted, haga esto:
Suponiendo que haya agregado un detector al ItemDataBoundEvent de su repetidora principal, necesitará cambiar ligeramente su consulta linq para no usar un tipo anónimo (Crear una clase protegida que tenga sus propiedades) En mi caso, estoy usando dto como nombre de clase.
void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Repeater rep2 = (Repeater)e.Item.FindControl("rep2");
rep2.DataSource = ((dto)e.Item.DataItem).y;
rep2.DataBind();
}
Me encantaría saber por qué crees que no puedes resolver esto en el código subyacente.
Esto no ocultará por completo el repetidor, pero puede subclasificar el control Repeater para que incluya una plantilla de datos vacía similar a GridView:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public class EmptyCapableRepeater : Repeater
{
public ITemplate EmptyDataTemplate { get; set; }
protected override void OnDataBinding ( EventArgs e )
{
base.OnDataBinding( e );
if ( this.Items.Count == 0 )
{
EmptyDataTemplate.InstantiateIn( this );
}
}
}
Puedes usarlo en tu .aspx de esta manera:
<custom:EmptyCapableRepeater runat="server" ID="rptSearchResults">
<ItemTemplate>
<%# Eval( "Result" )%>
</ItemTemplate>
<SeparatorTemplate>
<br />
</SeparatorTemplate>
<EmptyDataTemplate>
<em>No results were found.</em>
</EmptyDataTemplate>
</custom:EmptyCapableRepeater>
¿Por qué no usar un ListView? Ofrece muchas de las mismas funciones, incluida una EmptyDataTemplate.
Sé que este es un hilo viejo y la respuesta anterior es una solución muy buena, pero tuve un problema similar y encontré otra solución sencilla que pensé que también compartiría. Esto valida muy bien y muestra lo mismo.
Simplemente cambie su plantilla de pie de página a:
<FooterTemplate>
<li style="display:none;">This will not show.</li></ul>
</FooterTemplate>
O si usa tablas:
<FooterTemplate>
<tr> style="display:none;"><td>But something must be in here.</td></tr></table>
</FooterTemplate>
Espero que ayude a alguien!
En el evento OnItemDataBound
, establezca visibilidad en falso si ItemType
es un Header
y establezca la visibilidad en verdadero si ItemType
es un Item
.
utilizar esta:
protected void Repeater1_PreRender(object sender, EventArgs e)
{
if (Repeater1.Items.Count < 1)
{
container.Visible = false;
}
}