gpt4 book ai didi

c# - 使用 Linq 和 group by 进行数据绑定(bind)转发器

转载 作者:行者123 更新时间:2023-12-02 12:00:14 27 4
gpt4 key购买 nike

我需要将转发器与分层数据绑定(bind),如下所示:

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 进行区分,仅选择类别字段。将其绑定(bind)到外部中继器。

在第二个中继器中,选择其 where 条件的类别字段等于正在数据绑定(bind)到中继器项目的值的数据。您必须在中继器的 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();
}
}
}

关于c# - 使用 Linq 和 group by 进行数据绑定(bind)转发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7508051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com