在每行中继器中绑定5个项目

时间:2012-07-04 11:09:38

标签: c# asp.net sql repeater

我有一组来自数据库的项目。他们的数量可能会有所我把它们绑在一个转发器里。现在我的下面的例子将解释我想要的东西:
我有11个来自数据库的项目,我希望它们按每行5个项目分组。

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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

如果可以使用ListView,则可以使用GroupItemCount。像MSDN Example

这样的东西
<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>

答案 2 :(得分:3)

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

首先,您可以坚持使用一个扁平的项目列表,并使转发器插入一个新的行&#34;每个第5项后。您应该能够在<ItemTemplate>中使用

这样的块来执行此操作
<% if ((Container.DataItemIndex % 5) == 4) { %>
    </div>
    <div>
<% } %>

老实说,这不是很好。

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

答案 3 :(得分:2)

你可以尝试下面,我错误地说ListView,实际上我的意思是DataList

    <asp:DataList ID="DataList1" runat="server" RepeatColumns="5" 
        RepeatDirection="Horizontal" RepeatLayout="Flow">
        <ItemTemplate >
            <%--Your Item Data goes here--%>
        </ItemTemplate>            
    </asp:DataList>

答案 4 :(得分:2)

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

示例数据源组件:

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();
}

答案 5 :(得分: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();
        }
    }
}