数据绑定中继器使用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();

数据绑定中继器使用Linq与组by

你需要一个中继器嵌套在另一个中继器内。

对仅选择类别字段的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