3

我有一组来自数据库的项目。他们的数量可能会有所不同。我已将它们绑定在中继器中。现在我的以下示例将解释我想要什么:
我有 11 个来自数据库的项目,我希望它们按照每行 5 个项目进行分组。

  • 第 1 行:5 个项目。
  • 第 2 行:5 项。
  • 第 3 行:1 项。

目前,我只是将它们绑定在转发器中。我该怎么做呢?

4

6 回答 6

8

是的。有可能的:

<asp:Repeater ID="rptItems" runat="server">
           <ItemTemplate>
               <asp:Literal runat="server" Text='<%# Eval("Value") %>'></asp:Literal>
               <div style="clear: both" runat="server" Visible="<%# (Container.ItemIndex+1) % 5 == 0 %>"></div>
           </ItemTemplate>
       </asp:Repeater>

它为数字序列产生以下结果:

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

于 2012-07-04T11:35:15.600 回答
4

如果你可以使用 ListView,那么你可以使用 GroupItemCount 。像这样的 MSDN 示例

<asp:ListView ID="ContactsListView" 
        DataSourceID="yourDatasource" 
        GroupItemCount="5"        
        runat="server">
        <LayoutTemplate>
          <table id="tblContacts" runat="server" cellspacing="0" cellpadding="2">
            <tr runat="server" id="groupPlaceholder" />
          </table>

        </LayoutTemplate>
        <ItemTemplate>
          <div> your Items here </div>
        </ItemTemplate>
        <GroupTemplate>
          <tr runat="server" id="ContactsRow" style="background-color: #FFFFFF">
            <td runat="server" id="itemPlaceholder" />
          </tr>
        </GroupTemplate>
        <ItemSeparatorTemplate>
          <td runat="server" style="border-right: 1px solid #00C0C0">&nbsp;</td>
        </ItemSeparatorTemplate>
      </asp:ListView>
于 2012-07-04T11:24:35.237 回答
3

如果您想坚持使用中继器,我可以想到两种方法。

首先,您可以坚持使用平面项目列表,并让中继器在每 5 个项目之后插入一个“新行”。您应该可以在<ItemTemplate>类似的块中执行此操作

<% if ((Container.DataItemIndex % 5) == 4) { %>
    </div>
    <div>
<% } %>

老实说,这不是很好。

或者,您可以使用MoreLINQBatch方法将您的项目批量处理IEnumerable为 5 个,然后使用两个嵌套转发器来呈现它们。设置外部中继器以将内部中继器包装在<div>标签中,并设置内部中继器的DataSource='<%# Container.DataItem %>'. 这应该会导致更清晰的标记。

于 2012-07-04T11:33:21.503 回答
2

你可以试试下面,我说错了ListView,其实我说的是DataList

    <asp:DataList ID="DataList1" runat="server" RepeatColumns="5" 
        RepeatDirection="Horizontal" RepeatLayout="Flow">
        <ItemTemplate >
            <%--Your Item Data goes here--%>
        </ItemTemplate>            
    </asp:DataList>
于 2012-07-04T11:24:23.020 回答
2

您可以使用嵌套数据控件(即Repeater)并处理OnItemDataBound事件以绑定内部中继器。

示例数据源组件:

public class Item
{
    public int ID { get; set; }
    public string Name { get; set; }

    public static List<List<Item>> getItems()
    {
        List<Item> list = new List<Item>()
        {
                new Item(){ ID=11, Name="A"},
                new Item(){ ID=12, Name="B"},
                new Item(){ ID=13, Name="C"},
                new Item(){ ID=14, Name="D"},
                new Item(){ ID=15, Name="E"},
        };

        /* Split the list as per specified size */

        int size = 2;
        var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
                    .Select(index => list.GetRange(index * size,
                        Math.Min(size, list.Count - index * size)))
                    .ToList();

        return lists;
    }
}

标记 (.aspx)

<asp:Repeater ID="outerRepeater"
            runat="server" onitemdatabound="outerRepeater_ItemDataBound"
            >
    <ItemTemplate>
    <p>
    Row
    </p>
    <asp:Repeater ID="innerRepeater"
                    runat="server">
        <ItemTemplate>
            <asp:Literal ID="literal1" runat="server" Text='<%# Eval("ID") %>' />
            <asp:Literal ID="literal2" runat="server" Text='<%# Eval("Name") %>' />
        </ItemTemplate>              
    </asp:Repeater>
    </ItemTemplate>              
</asp:Repeater>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        outerRepeater.DataSource = Item.getItems();
        outerRepeater.DataBind();
    }
}
protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Repeater repeater = e.Item.FindControl("innerRepeater") as Repeater;
    repeater.DataSource = Item.getItems()[e.Item.ItemIndex];
    repeater.DataBind();
}
于 2012-07-04T11:55:09.810 回答
0
 <asp:Repeater ID="Repeater1" runat="server"
  OnItemDataBound="Repeater1_databinding">

                <HeaderTemplate>
                    <table id="masterDataTable" class="reportTable list issues" width="100%">
                        <thead>
                            <tr>
                                <asp:Literal ID="literalHeader" runat="server"></asp:Literal>
                            </tr>
                        </thead>
                        <tbody>
                </HeaderTemplate>
                <ItemTemplate>
                    <tr>
                        <asp:Literal ID="literals" runat="server"></asp:Literal>
                    </tr>
                </ItemTemplate>
                <FooterTemplate>
                    </tbody> </table>
                </FooterTemplate>
            </asp:Repeater>
    <input id="hdnColumnName" runat="server" clientidmode="Static" type="hidden" />
    <input id="hdnColumnOrder" runat="server" clientidmode="Static" type="hidden" />


// javascript Function

 <script type="text/javascript">
    $(document).ready(function () {
        $('#ddlReport').removeClass('required');
        $('.sort').click(function () {
            $('#hdnColumnName').val($(this).text());
            $('#hdnColumnOrder').val($(this).attr('class'));
            $(this).toggleClass("desc asc");
            $("#lnkSort").click();
        });
    });
</script>

 // Bind repeater

       DataTable dt = objReport.GetCustomRecord();
        fn = new List<string>();
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            if (dt.Columns[i].ColumnName != "Maxcount" )
            {
                fn.Add(dt.Columns[i].ColumnName);
            }
        }

        Repeater1.DataSource = dt;
        Repeater1.DataBind();



protected void Repeater1_databinding(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)
    {
        if (e.Item.FindControl("literalHeader") != null)
        {
            StringBuilder sb = new StringBuilder();
            Literal li = e.Item.FindControl("literalHeader") as Literal;

            fieldName().ForEach(delegate(string fn)
            {
                if (hdnColumnName.Value != fn.ToString())
                {
                    sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort desc\" onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\" >"
                        + fn.ToString() + "</a></th>");
                }
                else
                {
                    if (hdnColumnOrder.Value == "sort asc")
                        sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort desc\"  onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\" >"
                       + fn.ToString() + "</a></th>");
                    else
                        sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort asc\" onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\">"
                                                   + fn.ToString() + "</a></th>");
                }
            });
            li.Text = sb.ToString();

        }

    }
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        if (e.Item.FindControl("literals") != null)
        {
            DataRowView drv = (DataRowView)e.Item.DataItem;
            Literal li = e.Item.FindControl("literals") as Literal;
            StringBuilder sb = new StringBuilder();
            fieldName().ForEach(delegate(string fn)
            {
                sb.Append("<td>" + drv[fn.ToString()] + "</td>");
            });
            li.Text = sb.ToString();
        }
    }
}
于 2016-02-29T11:30:18.287 回答