C# 每行中继器绑定5项
我有一组来自数据库的项目。他们的人数可能会有所不同。我把它们绑在一个复读器里。下面的例子将解释我想要的:C# 每行中继器绑定5项,c#,asp.net,sql,repeater,C#,Asp.net,Sql,Repeater,我有一组来自数据库的项目。他们的人数可能会有所不同。我把它们绑在一个复读器里。下面的例子将解释我想要的: 我有11项来自数据库,我希望他们被分组在5项每行的条款 第一行:5项 第二排:5项 第三行:1项 目前,我只是将它们绑定到一个转发器中。我该怎么做呢?你可以试试下面,我错误地说是ListView,实际上我指的是DataList <asp:DataList ID="DataList1" runat="server" RepeatColumns="5" Rep
我有11项来自数据库,我希望他们被分组在5项每行的条款
- 第一行:5项李>
- 第二排:5项李>
- 第三行:1项
目前,我只是将它们绑定到一个转发器中。我该怎么做呢?你可以试试下面,我错误地说是ListView,实际上我指的是DataList
<asp:DataList ID="DataList1" runat="server" RepeatColumns="5"
RepeatDirection="Horizontal" RepeatLayout="Flow">
<ItemTemplate >
<%--Your Item Data goes here--%>
</ItemTemplate>
</asp:DataList>
如果可以使用ListView,则可以使用GroupItemCount。像这样的东西
您的物品在这里吗
如果你想继续使用中继器,我可以想出两种方法
首先,你可以坚持一个简单的项目列表,让中继器在每第五个项目后插入一个“新行”。您应该能够在
中使用类似
<% if ((Container.DataItemIndex % 5) == 4) { %>
</div>
<div>
<% } %>
老实说,这不是很好
或者,您可以使用的方法将项目批处理为5的IEnumerable
s,然后使用两个嵌套的中继器渲染它们。设置外部中继器以将内部中继器包装在
标记中,并设置内部中继器的数据源=''
。这将导致更清晰的标记。是的。有可能:
<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>
它为数字序列生成以下结果:
123445
678910
1112131415
16 17 18 19 20您可以使用嵌套的数据控件(即中继器
),也可以处理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;
}
}
//javascript函数
$(文档).ready(函数(){
$(“#ddlReport”).removeClass('required');
$('.sort')。单击(函数(){
$('#hdnColumnName').val($(this.text());
$('hdnColumnOrder').val($(this.attr('class'));
$(this.toggleClass(“desc asc”);
$(“#lnkSort”)。单击();
});
});
//绑定中继器
DataTable dt=objReport.GetCustomRecord();
fn=新列表();
对于(int i=0;i
为什么不使用定义列的列表视图?您希望如何对这些项进行分组?你的意思是通过一个特定的列来对他们进行分组吗?你想把它们连接起来吗?@Furqan你能提供一个example@MahmoudGamal我只想让他们5人一组出现。不要按任何类型对他们进行分组。所有答案都很有帮助。但是我接受了一个对我有用的+1。这是块的很好的替代方案。在reapter控件中,不能将容器与if语句一起使用
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;
}
}
<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();
}
<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();
}
}
}