2009-02-18 14 views
13

Sto utilizzando un ripetitore asp.net per creare un gruppo di immagini. Il markup dell'immagine è lo stesso, quindi lo standard <ItemTemplate> va bene.Modello ripetitore ASP.NET, codice condizionale per ogni ennesimo elemento

Tuttavia, voglio avvolgere immagini K in un div. Diciamo che lego più di 25 immagini al ripetitore e voglio 5 immagini per div. Come faccio a creare in modo condizionale i tag di inizio e chiusura per il div?

Si tratta di un caso più adatto per un ciclo for.

+0

È possibile ottenere tale risultato utilizzando i concetti illustrati di seguito, è solo necessario modificarlo in base alle proprie esigenze. Gli utenti di StackOverflow non sono qui per scrivere "teh codez" per te, siamo qui per aiutarci l'un l'altro a imparare. Mostraci il codice che hai scritto/provato e possiamo aiutarti a risolverlo. – Dhaust

+1

Sì, basta chiarire la domanda – ckarbass

risposta

23

questo dovrebbe funzionare per voi, senza bisogno di nulla nel codice dietro (diverso vincolante ripetitore ..):

<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

Qualcuno sa come utilizzare una normale istruzione "if" nella mia risposta anziché l'operatore ternario (per perdere l'opzione stringa vuota alla fine)? – Nick

+5

Non possibile, l'istruzione if non è un'espressione (non valuta un valore), quindi non può essere utilizzata nella sintassi di associazione dati. –

+0

@michielvoo - Ho pensato che fosse il caso, grazie per la spiegazione – Nick

2

Aggiungi due controlli etichetta vuoti nel ItemTemplate dei ripetitori in cui desideri inserire i tag div.

Quindi aggiungere un evento ItemDataBound al ripetitore.

Quindi aggiungere questo codice nel caso 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 - Questo avrà bisogno di qualche ritocco per gestire la prima div e potrebbe essere necessario fare qualcosa di simile Se (e.Item.ItemIndex + 1) Mod 5 = 0 per far apparire i div esattamente dove li vuoi.

Per maggiori informazioni:
DataListItem.ItemIndex Property
DataList.ItemDataBound Event

+1

Fermare la pazzia. NET! In PHP questa sarebbe una condizione semplice all'interno di un foreach nel template. Ad ogni modo, +1 per la soluzione. – rick

+0

HaHa. Chiama Rick. Sono sicuro che c'è un modo più intelligente per farlo in .NET, non sono abbastanza intelligente per saperlo;) – Dhaust

+6

Il modo più intelligente per farlo in .NET è passare a ASP.NET MVC –

3

Se si desidera mantenere il vostro codice nella pagina ASPX si potrebbe anche provare questa variante al metodo di David:

Nella pagina aspx:

Nell'evento ItemDataBound nel codebehind:

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

Sì, mantenere il markup sulla pagina è una buona chiamata Jorge. Probabilmente più leggibile rispetto alla mia versione;) – Dhaust

+1

Buon uso dei tag letterali. Sembra che troppe persone usino le etichette per scrivere il markup sulla pagina, quando il controllo letterale fa lo stesso, ma senza i tag generati con i controlli dell'etichetta. –

10

Qui è dove Asp.Net WebForms può dare incredibili RAD efficienza. È possibile utilizzare il nuovo controllo ListView e impostare il numero di elementi per "gruppo", che consente di impostare l'HTML che circonda un gruppo, nonché ogni singolo elemento. In questo modo puoi circondare il gruppo con i tag condizionali.

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