2009-02-18 26 views
13

Estoy usando un repetidor asp.net para crear un conjunto de imágenes. El marcado de la imagen es el mismo, por lo que el estándar <ItemTemplate> está bien.Plantilla de repetidor de ASP.NET, código condicional para cada elemento Nth

Sin embargo, quiero envolver K imágenes en un div. Digamos que ato más de 25 imágenes al repetidor y quiero 5 imágenes por div. ¿Cómo realizo la creación condicional de las etiquetas de inicio y cierre de div?

Este es un caso más adecuado para un bucle for.

+0

Puede lograrlo utilizando los conceptos que se muestran a continuación, _sólo tiene que modificarlo para adaptarlo a sus propósitos. Los usuarios de StackOverflow no están aquí para escribir 'te codez', estamos aquí para ayudarnos unos a otros a aprender. Muéstranos el código que has escrito/intentado y podemos ayudarte a ordenarlo. – Dhaust

+1

Sí, simplemente aclarando la pregunta – ckarbass

Respuesta

23

Esto debería funcionar para usted, sin necesidad de nada en el código subyacente (que no sea vinculante el repetidor ..):

<asp:Repeater ID="repImages" runat="server"> 
<HeaderTemplate><div></HeaderTemplate> 

<ItemTemplate> 
<%# (Container.ItemIndex != 0 && Container.ItemIndex % 5 == 0) ? @"</div><div>" : string.Empty %> 
<asp:Image ID="imgGallery" runat="server" ImageUrl='<%# /* your code here */ %>' /> 
</ItemTemplate> 

<FooterTemplate></div></FooterTemplate> 
</asp:Repeater> 
+0

¿Alguien sabe cómo puedo usar una instrucción regular 'if' en mi respuesta en lugar del operador ternario (para perder la opción de cadena vacía al final)? – Nick

+5

No es posible, la instrucción if no es una expresión (no se evalúa a un valor), por lo que no se puede utilizar en la sintaxis de enlace de datos. –

+0

@michielvoo - Pensé que ese era el caso, gracias por la explicación – Nick

2

Agregue dos controles de etiqueta vacíos en su plantilla de elemento Repeaters donde desea que aparezcan sus etiquetas div.

A continuación, agregue un evento ItemDataBound al repetidor.

A continuación, agregue el código en el evento ItemDataBound:

Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) 
    If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then 
     If e.Item.ItemIndex Mod 5 = 0 Then 
      Dim lblDivStart As Label = CType(e.Item.FindControl("lblDivStart"), Label) 
      Dim lblDivEnd As Label = CType(e.Item.FindControl("lblDivEnd"), Label) 
      lblDivStart.text = "<div>" 
      lblDivEnd.text = "</div>" 
     End If 
    End If 
End Sub 

Nota - Esto tendrá algunos ajustes para manejar la primera div y puede que tenga que hacer algo como Si (e.Item.ItemIndex + 1) Mod 5 = 0 para que los divs aparezcan exactamente donde los quiere.

Para más información:
DataListItem.ItemIndex Property
DataList.ItemDataBound Event

+1

¡Detenga la locura de .NET! En php esto sería una condición simple dentro de un foreach en la plantilla. De todos modos, +1 para la solución. – rick

+0

HaHa. Fair call Rick. Estoy seguro de que hay una forma más inteligente de hacer esto en .NET, simplemente no soy lo suficientemente inteligente como para saberlo;) – Dhaust

+6

La forma más inteligente de hacer esto en .NET es cambiar a ASP.NET MVC –

3

Si desea mantener su margen de beneficio en la página ASPX también se podría tratar esta variación en el método de David:

En la página aspx:

<ItemTemplate> 
<asp:Literal runat="server" ID="divStart" Text="<div>" /> 
<asp:Image ....> 
<asp:Literal runat="server" ID="divEnd" Text="</div>" /> 
</ItemTemplate> 

En el evento ItemDataBound en el código subyacente:

e.Item.FindControl("divStart").Visible 
    = e.Item.FindControl("divEnd").Visible 
    = e.Item.ItemIndex % 5 == 0; 
+0

Sí, mantener el marcado en la página es una buena llamada Jorge. Probablemente más legible que mi versión también;) – Dhaust

+1

Buen uso de las etiquetas literales. Parece que mucha gente usa etiquetas para escribir marcas en la página, cuando el control literal hace lo mismo, pero sin las etiquetas que se generan con los controles de etiqueta. –

10

Aquí es donde Asp.Net WebForms le puede dar increíble RAD eficiencia. Puede usar el nuevo control ListView y establecer el número de elementos por "grupo", lo que le permitirá configurar el HTML que rodea a un grupo, así como también cada elemento individual. De esta forma puede rodear al grupo con las etiquetas condicionales.

<asp:ListView ID="ListView1" runat="server" DataKeyNames="id" DataSourceID="LinqDataSource1" GroupItemCount="3"> 
<LayoutTemplate> 
    <div id="layout"> 
     <asp:PlaceHolder ID="groupPlaceholder" runat="server"></asp:PlaceHolder> 
    </div> 
</LayoutTemplate> 
<GroupTemplate> 
    <div class="group"> 
     <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder> 
    </div> 
</GroupTemplate> 
<EmptyDataTemplate> 
    <span>No data was returned.</span> 
</EmptyDataTemplate> 
<ItemTemplate> 
    <div class="item"> 
     <img alt='<%# Eval("title") %>' title='<%# Eval("title") %>' 
      src='<%# Eval("filename","photos/{0}") %>' /> 
    </div> 
</ItemTemplate> 
</asp:ListView> 
Cuestiones relacionadas