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