14

我正在使用 asp.net 中继器来创建一堆图像。图像标记都是一样的,所以标准<ItemTemplate>很好。

但是,我想将 K 图像包装在一个 div 中。假设我将 25+ 图像绑定到中继器,并且我想要每个 div 5 图像。如何有条件地为 div 创建开始和结束标签?

这是一个更适合 for 循环的案例吗?

4

4 回答 4

24

这应该对您有用,不需要后面的代码中的任何内容(除了绑定中继器..):

<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>
于 2009-02-18T18:37:22.397 回答
10

这就是 Asp.Net WebForms 可以为您提供令人难以置信的 RAD 效率的地方。您可以使用新的 ListView 控件,并设置每个“组”的项目数,这将允许您设置围绕组的 HTML,以及每个单独的项目。这样,您可以使用条件标签围绕组。

<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>
于 2009-05-14T18:24:29.853 回答
3

如果你想在 ASPX 页面上保留你的标记,你也可以尝试 David 方法的这种变体:

在 aspx 页面上:

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

在代码隐藏的 ItemDataBound 事件中:

e.Item.FindControl("divStart").Visible
    = e.Item.FindControl("divEnd").Visible 
    = e.Item.ItemIndex % 5 == 0;
于 2009-02-18T06:37:48.197 回答
2

将两个空标签控件添加到您希望 div 标签所在的Repeaters ItemTemplate 中。

然后向Repeater 添加一个ItemDataBound 事件。

然后将此代码添加到 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

注意 - 这需要一些调整来处理第一个 div,您可能需要执行类似 If (e.Item.ItemIndex + 1) Mod 5 = 0的操作,以使 div 准确显示在您想要的位置。

有关详细信息:
DataListItem.ItemIndex 属性
DataList.ItemDataBound 事件

于 2009-02-18T06:26:23.997 回答