Отличительное значение столбца в C # DataTable - PullRequest
2 голосов
/ 13 мая 2019

У меня есть 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

Я пытаюсь вывести его в HTML через веб-формы.Проблема в том, что результат всегда может отличаться, но он всегда должен группироваться по foodEaten.

То, что я после, - это, в основном, способ сгруппировать результаты по столбцу foodEaten, но затем выписать тех, кто съел пищу под ним.Мне просто нужно указать в правильном направлении, как я могу динамически назначить это asp: repeater.Или что-то подобное.

В идеале это выглядело бы так на странице -

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

Спасибо

Сэм

Редактировать -

У меня теперь естьразличные значения данных, которые содержат различные значения foodEaten!Теперь чтобы понять, как сравнивать.

Edit2 -

Теперь у меня есть DataSet, который содержит различные значения «foodEaten» в качестве имен таблиц и соответствующие строки в каждой таблице на основе столбца foodEaten.Теперь мне просто нужно привязать это, ретинно к ретранслятору!

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Я бы использовал 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"].Надеюсь, это поможет.

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

** РЕДАКТИРОВАНИЕ: Обновлено, чтобы показать, как это может передаваться на вложенный повторитель.

Вам необходимо добавить событие, связанное с данными, в ваш главный ретранслятор.Затем, когда вы связываете свой ретранслятор, каждый элемент запускает вложенный репитер.Увидеть ниже.Примечание. Я также настроил 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>

code-behind:

привязка основного повторителя:

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, чтобы получить идентификатор, имя, сумму Eaten или все, что вам нужно.Надеюсь, это поможет.

0 голосов
/ 13 мая 2019

Если производительность не является проблемой, вы можете привести эту таблицу к Enumerable, а затем использовать на ней Linq. Примерно так:

var result = table.AsEnumerable().GroupBy(row => row["Food"]).Select(grp => new
{
    Food = grp.Key,
    Eaten = grp.Sum(eaten => (int)eaten["amountEaten"])
});


foreach (var grp in result)
{
    log($"{grp.Food}  ->  {grp.Eaten}");                
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...