数据绑定中继器使用Linq与组by
本文关键字:与组 by Linq 中继器 数据绑定 | 更新日期: 2023-09-27 18:09:12
我需要用分层数据绑定一个中继器,如下所示:
Category1
- Item1
- Item2
Category2
- Item3
- Item4
我目前有一个包含项目以及每个项目所属类别的单一数据集。
我正在尝试学习Linq,想知道是否有一种方法我可以使用Linq做同样的事情?
下面是我的尝试:
var groupbyfilter = from dr in dtListing.AsEnumerable()
group dr by dr["Category"];
DataTable dtFinal = dtListing.Clone();
foreach (var x in groupbyfilter)
x.CopyToDataTable(dtFinal, LoadOption.OverwriteChanges);
rptList.DataSource = dtFinal;
rptList.DataBind();
你需要一个中继器嵌套在另一个中继器内。
对仅选择类别字段的dtlisting
执行distinct操作。把它绑定到外部中继器
在第二个中继器中,选择where条件的category字段等于绑定到中继器项的值的数据。您必须在中继器的onitem_databound
事件中处理此问题。
下面是一个例子。
<%@ Import Namespace="System.Data" %>
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<div>
Category: <b><%# Container.DataItem%></b>
<asp:Repeater ID="Repeater2" runat="server">
<FooterTemplate>
<%="</ul>" %>
</FooterTemplate>
<HeaderTemplate>
<%= "<ul>"%>
</HeaderTemplate>
<ItemTemplate>
<li>
<%# ((Data.DataRow)Container.DataItem)[1] %>, <%# ((Data.DataRow)Container.DataItem)[0] %>
</li>
</ItemTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
</asp:Repeater>
对于这个示例,我使用csv作为数据源,并使用它创建了一个数据表。所以我的代码后面看起来像:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class _Default : System.Web.UI.Page
{
DataTable csvData;
protected void Page_Load(object sender, System.EventArgs e)
{
csvData = Utils.csvToDataTable("data.csv", true);
GridView1.DataSource = csvData;
GridView1.DataBind();
Repeater1.DataSource =
(from x in csvData.AsEnumerable() select x["category"]).Distinct();
Repeater1.DataBind();
}
protected void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item |
e.Item.ItemType == ListItemType.AlternatingItem) {
Repeater rptr = (Repeater)e.Item.FindControl("Repeater2");
rptr.DataSource =
csvData.AsEnumerable().Where(x => x["category"].Equals(e.Item.DataItem));
rptr.DataBind();
}
}
}
你可以像deostroll说的那样使用嵌套的重复器,或者指定一个分组字段,并在你的ItemTemplate中有一个组头,当你的分组字段发生变化时,它会动态隐藏(或呈现)。
fernan的回答详见http://forums.asp.net/t/1252235.aspx