gpt4 book ai didi

c# - C# DataTable 中的不同列值

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:23 24 4
gpt4 key购买 nike

我在 C# 中有一个数据表,如下所示。

ID | Name | foodEaten | amountEaten
1 | Sam | Burger | 3
2 | Jeff | Burger | 2
3 |Steve | Burger | 1
4 |Clive | Mcdonalds | 4
5 |Mike | KFC | 12
6 |Cliff | KFC | 5

我尝试使用网络表单将其基本上输出为 HTML。问题是,输出可能总是不同的,但它总是需要根据 foodEaten 进行分组。

我所追求的基本上是一种在 foodEaten 列上对结果进行分组的方法,然后在下面写出那些吃了食物的人。我只需要指出正确的方向,说明如何将其动态分配给 asp:repeater。或者类似的东西。

理想情况下它在页面上看起来像这样 -

 <h3> Burger(3)<h3>
<p> Sam - 3 <p>
<p> Jeff - 2 <p>
<p> Steve - 1 <p>

谢谢

山姆

编辑 -

我现在有一个不同的值数据表,其中包含不同的 foodEaten 值!现在研究如何比较。

编辑2 -

我现在有一个数据集,其中包含不同的“foodEaten”值作为表名,以及每个表中基于 foodEaten 列的相应行。现在我只需要将其动态绑定(bind)到中继器!

最佳答案

我会使用 LINQ,因为它比在循环中编写逻辑更简洁。

var groupedDT = dataTable.AsEnumerable()
.GroupBy(x => x.Field<string>("foodEaten"))
.Select(o => new
{
food = o.Key,
personsCount = dataTable.AsEnumerable().Where(row => row.Field<string>("foodEaten") == o.Key).ToList().Count
})
.ToList();

这将返回一份包含不同食物的列表以及一份嵌套列表,其中列出了食用该食物的人及其食用量。您可以通过执行类似 groupedDT[ foodIndex ].dataRows[ personIndex ]["Name"] 的操作来循环访问数据(例如 Name)。希望这会有所帮助。

============================================= =====================

** 编辑:已更新以显示如何将其馈送到嵌套的转发器。

您需要向主中继器添加一个 ondatabound 事件。然后,当您绑定(bind)转发器时,每个项目都会触发嵌套的转发器绑定(bind)。见下文。注意:我还调整了 LINQ 以对数据表进行分组,这样您就可以获得人数(上图)。

aspx:

<asp:Repeater runat="server" ID="repFood" OnItemDataBound="repFood_ItemDataBound">
<ItemTemplate>

<h3><%# Eval("food") + " (" + Eval("personsCount") + ")" %></h3>
<asp:HiddenField runat="server" ID="hfFoodEaten" Value='<%# Eval("food") %>' />

<asp:Repeater runat="server" ID="repPersons">
<ItemTemplate>
<p><%# Eval("[\"Name\"]") + " - " + Eval("[\"amountEaten\"]") %></p>
</ItemTemplate>
</asp:Repeater>

</ItemTemplate>
</asp:Repeater>

代码隐藏:

绑定(bind)主中继器:

repFood.DataSource = groupedDT;
repFood.DataBind();

ondatabound 事件:

protected void repFood_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var hfFoodEaten = e.Item.FindControl("hfFoodEaten") as HiddenField;
var repPersons = e.Item.FindControl("repPersons") as Repeater;
var dataSource = ViewState["DataTable"] as DataTable;

repPersons.DataSource = dataSource.AsEnumerable().Where(row => row.Field<string>("foodEaten") == hfFoodEaten.Value).ToList();
repPersons.DataBind();
}

向主要转发器项目添加隐藏字段是将 foodEaten 变量传递给嵌套转发器的简单方法。使用它来获取食物匹配的数据行。然后在 aspx 中,使用 Eval 获取 ID、Name、amountEaten 或您需要的任何内容。希望这会有所帮助。

关于c# - C# DataTable 中的不同列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112877/

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