使用Linq和group by的数据绑定中继器

我需要将转发器与分层数据绑定如下:

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上做一个不同的选择,只选择category字段。 将此绑定到外部中继器。

在第二个转发器中,选择其条件具有类别字段的数据,该字段等于正在转发到转发器项目的值。 您必须在转发器的onitem_databound事件中处理此问题。

这是一个例子。

 <%@ Import Namespace="System.Data" %>   
Category: <%# Container.DataItem%> <%="" %> <%= "
    "%>
  • <%# ((Data.DataRow)Container.DataItem)[1] %>, <%# ((Data.DataRow)Container.DataItem)[0] %>
  • 对于此示例,我使用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