在每行中继器中绑定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(); } } }