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

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

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

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

是。 有可能的:

    

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

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

如果您可以使用ListView,则可以使用GroupItemCount。 有点像这样的MSDN示例

   
your Items here
 

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

首先,您可以坚持使用一个扁平的项目列表,并使转发器在每个第5项之后插入“新行”。 您应该可以在使用类似的块执行此操作

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

老实说,这不是很好。

或者,您可以使用MoreLINQ的Batch方法将项目批量处理为IEnumerable s of 5,然后使用两个嵌套的中继器来渲染它们。 设置外部转发器以将内部转发器包装在

标记中,并设置内部转发器的DataSource='<%# Container.DataItem %>' 。 这应该会产生更清晰的标记。

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

    <%--Your Item Data goes here--%>   

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

示例数据源组件:

 public class Item { public int ID { get; set; } public string Name { get; set; } public static List> getItems() { List list = new List() { 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)

   

Row

代码隐藏

 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(); } 
    
// javascript Function // Bind repeater DataTable dt = objReport.GetCustomRecord(); fn = new List(); 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(" " + fn.ToString() + ""); } else { if (hdnColumnOrder.Value == "sort asc") sb.Append(" " + fn.ToString() + ""); else sb.Append(" " + fn.ToString() + ""); } }); 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("" + drv[fn.ToString()] + ""); }); li.Text = sb.ToString(); } } }