我在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
我正在尝试使用Webforms将其基本上输出为HTML。问题是,输出始终可以变化,但是始终需要在foodEaten上分组。
我想说的基本上是一种将结果分组在foodEaten列上的方法,然后写出那些在下面吃食物的人。我只需要指出正确的方向,如何将其动态分配给asp:repeater。或类似的东西。
理想情况下,页面上看起来像这样-
<h3> Burger(3)<h3>
<p> Sam - 3 <p>
<p> Jeff - 2 <p>
<p> Steve - 1 <p>
谢谢
山姆
编辑-
我现在有一个不同的值数据表,其中包含不同的foodEaten值!现在来研究如何比较。
Edit2-
我现在有一个数据集,其中包含不同的“ foodEaten”值作为表名,以及每个表中基于foodEaten列的相应行。现在,我只需要将其动态地绑定到中继器即可!
答案 0 :(得分:1)
我将使用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事件。然后,当您绑定中继器时,每个项目都会触发嵌套的中继器绑定。见下文。注意:我还调整了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>
隐藏代码:
绑定主中继器:
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,名称,eateEaten或您需要的任何内容。希望这会有所帮助。
答案 1 :(得分:0)
如果性能不是问题,则可以将该表转换为Enumerable,然后在其上使用Linq。像这样:
private IAutomationService automationService = new AutomationService();