C#数据表中的不同列值

时间:2019-05-13 12:59:11

标签: c# loops datatable

我在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列的相应行。现在,我只需要将其动态地绑定到中继器即可!

2 个答案:

答案 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();