2009-02-18 6 views
13

Ich verwende einen asp.net-Repeater, um eine Reihe von Bildern zu erstellen. Das Bild Markup ist alle gleich, so dass der Standard <ItemTemplate> ist in Ordnung.ASP.NET Repeater-Vorlage, Bedingter Code für jedes N-te Element

Allerdings möchte ich K Bilder in einem div umhüllen. Sagen wir, ich bilde 25 Bilder an den Repeater und ich möchte 5 Bilder pro Div. Wie gehe ich unter bedingten Erstellen der Start-und schließen Tags für die div?

Ist dies ein Fall für eine for-Schleife besser geeignet.

+0

Sie erreichen dies mit den unten gezeigten Konzepten, _you_ müssen nur für Ihren Zweck zwicken. StackOverflow-Benutzer sind nicht hier, um "den Codez" für dich zu schreiben, wir sind hier, um einander zu helfen. Zeigen Sie uns den Code, den Sie geschrieben haben, und wir können Ihnen helfen, ihn zu sortieren. – Dhaust

+1

Yup, klärt nur die Frage – ckarbass

Antwort

23

Dies sollte für Sie arbeiten, ohne die Notwendigkeit irgendetwas in der Code-behind (außer den Repeater Bindung ..):

<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

Wer weiß, wie ich eine regelmäßige "if" -Anweisung in meiner Antwort anstelle des ternären Operators verwenden kann (um die leere Zeichenfolge Option am Ende zu verlieren)? – Nick

+5

Nicht möglich, die if-Anweisung ist kein Ausdruck (wird nicht als Wert ausgewertet). Daher kann sie nicht in der Datenbindungssyntax verwendet werden. –

+0

@michielvoo - Ich dachte, das war der Fall, danke für die Erklärung – Nick

2

Fügen Sie Ihrem Repeaters ItemTemplate zwei leere Label-Steuerelemente hinzu, in denen Sie Ihre div-Tags haben möchten.

Dann fügen Sie dem Repeater ein ItemDataBound-Ereignis hinzu.

Dann diesen Code in das Ereignis ItemDataBound hinzufügen:

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 

Hinweis - Diese einige Optimierungen benötigen, um das erste div zu handhaben und man kann so etwas wie If (e.Item.ItemIndex + 1 tun müssen) Mod 5 = 0, damit die divs genau dort angezeigt werden, wo Sie sie haben wollen.

Für weitere Informationen:
DataListItem.ItemIndex Property
DataList.ItemDataBound Event

+1

Stoppt den .NET-Wahnsinn! In PHP wäre dies eine einfache Bedingung innerhalb einer foreach in der Vorlage. Wie auch immer, +1 für die Lösung. – rick

+0

HaHa. Fairer Anruf Rick. Ich bin mir sicher, dass es in .NET eine intelligentere Methode dafür gibt. Ich bin einfach nicht schlau genug, es zu wissen.) – Dhaust

+6

Der klügere Weg, dies in .NET zu tun, ist auf ASP.NET MVC –

3

Wenn Sie Ihren Aufschlag auf die ASPX-Seite zu halten, wollen Sie auch diese Variante David Methode versuchen könnte:

Auf der aspx Seite:

Im ItemDataBound-Ereignis im Codebehind:

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

Yep zu verwenden, halten Sie die Markup auf der Seite ist ein guter Ruf Jorge. Wahrscheinlich auch lesbarer als meine Version;) – Dhaust

+1

Gute Verwendung der wörtlichen Tags. Es scheint zu viele Leute benutzen Etiketten, um Markup auf der Seite zu schreiben, wenn das Literal-Steuerelement das gleiche tut, aber ohne die Tags, die mit den Label-Steuerelementen generiert werden. –

10

Hier ist, wo Asp.Net WebForms Sie unglaubliche RAD geben kann Effizienz. Sie können das neue ListView-Steuerelement verwenden und die Anzahl der Elemente pro "Gruppe" festlegen. Dadurch können Sie den HTML-Code für eine Gruppe sowie jedes einzelne Element einrichten. Auf diese Weise können Sie die Gruppe mit den bedingten Tags umgeben.

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