2009-02-18 7 views
13

Tôi đang sử dụng bộ lặp asp.net để tạo một loạt hình ảnh. Đánh dấu hình ảnh đều giống nhau nên tiêu chuẩn <ItemTemplate> là tốt.Mẫu lặp lại ASP.NET, Mã điều kiện cho mọi thành phần Nth

Tuy nhiên, tôi muốn bao bọc hình ảnh K trong div. Giả sử tôi liên kết 25 hình ảnh với bộ lặp và tôi muốn 5 hình ảnh trên mỗi div. Làm cách nào để tôi tạo điều kiện cho việc bắt đầu và đóng các thẻ cho div?

Đây có phải là trường hợp phù hợp hơn cho vòng lặp for.

+0

Bạn có thể đạt được điều đó bằng cách sử dụng các khái niệm được hiển thị bên dưới, _you_ chỉ cần tinh chỉnh nó cho phù hợp với mục đích của bạn. Người dùng StackOverflow không ở đây để viết 'teh codez' cho bạn, chúng tôi ở đây để giúp nhau học hỏi. Hiển thị cho chúng tôi mã bạn đã viết/thử và chúng tôi có thể giúp bạn sắp xếp nó. – Dhaust

+1

Yup, chỉ cần làm rõ câu hỏi – ckarbass

Trả lời

23

này nên làm việc cho bạn, mà không cần bất cứ điều gì trong các mã sau (trừ ràng buộc repeater ..):

<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

Bất cứ ai biết cách tôi có thể sử dụng câu lệnh 'if' thông thường trong câu trả lời của tôi thay vì toán tử bậc ba (để mất tùy chọn chuỗi trống ở cuối)? – Nick

+5

Không thể, câu lệnh if không phải là một biểu thức (không đánh giá một giá trị), vì vậy nó không thể được sử dụng trong cú pháp ràng buộc dữ liệu. –

+0

@michielvoo - Tôi nghĩ đó là trường hợp, cảm ơn lời giải thích – Nick

2

Thêm hai nhãn điều khiển trống vào trong Mục hàng thử nghiệm của bạnTemplate nơi bạn muốn thẻ div của mình.

Sau đó thêm sự kiện ItemDataBound vào Bộ lặp.

Sau đó thêm mã này vào sự kiện 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 

Lưu ý - Điều này sẽ cần một số tinh chỉnh để xử lý các div đầu tiên và bạn có thể cần phải làm một cái gì đó giống như Nếu (e.Item.ItemIndex + 1) Mod 5 = 0 để nhận các div hiển thị chính xác vị trí bạn muốn.

Để biết thêm thông:
DataListItem.ItemIndex Property
DataList.ItemDataBound Event

+1

Dừng sự điên rồ của .NET! Trong php điều này sẽ là một điều kiện đơn giản trong một foreach trong mẫu. Dù sao, 1 cho giải pháp. – rick

+0

HaHa. Cuộc gọi công bằng Rick. Tôi chắc chắn có một cách thông minh hơn để làm điều này trong .NET, tôi không đủ thông minh để biết nó;) – Dhaust

+6

Cách thông minh hơn để thực hiện việc này trong .NET là chuyển sang ASP.NET MVC –

3

Nếu bạn muốn giữ lại đánh dấu của bạn trên trang ASPX bạn cũng có thể thử thay đổi này trên phương pháp của David:

Trên trang aspx:

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

Trong sự kiện ItemDataBound trong codebehind:

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

Yep, giữ cho đánh dấu trên trang là một cuộc gọi tốt Jorge. Có lẽ dễ đọc hơn cả phiên bản của tôi nữa;) – Dhaust

+1

Sử dụng tốt các thẻ chữ. Có vẻ như quá nhiều người sử dụng nhãn để viết đánh dấu trên trang, khi điều khiển bằng chữ không giống nhau, nhưng không có thẻ được tạo bằng các điều khiển nhãn. –

10

Đây là nơi Asp.Net WebForms có thể cung cấp cho bạn đáng kinh ngạc RAD hiệu quả. Bạn có thể sử dụng điều khiển ListView mới và đặt số mục cho mỗi "nhóm", điều này sẽ cho phép bạn thiết lập HTML bao quanh một nhóm, cũng như từng mục riêng lẻ. Bằng cách này bạn có thể bao quanh nhóm với các thẻ có điều kiện.

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