У меня есть этот класс C#:Группировка данных в пределах определенного диапазона
public class Option
{
public int OptionId { get; set; }
public string OptionName { get; set; }
public string OptionType { get; set; } //Three different types A,B,C
public int SortOrder { get; set; } //100-199, 200-299, etc.
}
GetOptions возвращает один вариант массива [].
Теперь то, что я хочу:
Первая: группа опций по OptionType
Тогда: Группировать элементы в первой группе по SortOrder, с условием, что вариант с SortOrder между 100-199 должны быть в одном группа, 200-299 в другой и т. д.
Я могу сделать первый, как:
IEnumerable<IGrouping<string, Option>> groupedOptions =
from option in options
group option by option.OptionType;
или это
var groupedOptions2 = options.GroupBy(p=>p.OptionType);
Во-вторых, я не знаю, как. Я попытался добавить еще один GroupBy, но это не сработало. Конечно, что-то не так.
Спасибо.
Обновление: Я получил его работу с использованием вложенного ретранслятора, но я не уверен, что это правильный путь или нет.
я получаю варианты, используя первый запрос я выше: groupedOptions
привязывание его к Repeater. Отобразите OptionType в этом повторителе. В DataBound случае повторителя я другая группировка:
IGrouping<OptionType, Option> itm =(IGrouping<OptionType, Option>) e.Item.DataItem;
IEnumerable<IGrouping<int, Option>> nestedGroupedOptions =
from option in itm
group option by option.SortOrder/100;
Тогда я связывание, что к внутреннему ретранслятора, который имеет CheckBoxList. Вот моя вся тестовая страница .aspx. Это отдельная страница и ее можно протестировать, отбросив ее на веб-сайте asp.net webforms.
<%@ Page Language="C#" %>
<!DOCTYPE html>
<script runat="server">
Dictionary<int, string> OptionGroupNames = null;
protected void Page_Load(object sender, EventArgs e)
{
OptionGroupNames = GetOptionGroupNames();
DisplayDrinks();
}
public void DisplayDrinks()
{
Option[] options = GetOptions();
IEnumerable<IGrouping<OptionType, Option>> groupedOptions =
from option in options
group option by option.OptionType;
rptrGroupOptions.DataSource = groupedOptions;
rptrGroupOptions.DataBind();
}
protected void rptrGroupOptions_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
IGrouping<OptionType, Option> itm = (IGrouping<OptionType, Option>)e.Item.DataItem;
Label lblHeader = e.Item.FindControl("lblOptionGroup") as Label;
Repeater rptrOptions = e.Item.FindControl("rptrOptions") as Repeater;
lblHeader.Text = itm.Key.ToString();
IEnumerable<IGrouping<int, Option>> groupedOptions =
from option in itm
group option by option.SortOrder/100;
rptrOptions.DataSource = groupedOptions;
rptrOptions.DataBind();
}
}
protected void rptrOptions_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
IGrouping<int, Option> itm = (IGrouping<int, Option>)e.Item.DataItem;
CheckBoxList cbl = e.Item.FindControl("cblOptions") as CheckBoxList;
Label lblOptionGroup = e.Item.FindControl("lblOptionGroupNum") as Label;
if (itm.Key != 1 && itm.Key != 2)
{
lblOptionGroup.Text = OptionGroupNames.First(p => p.Key == itm.Key).Value;
}
cbl.DataSource = itm;
cbl.DataBind();
}
}
public Option[] GetOptions()
{
var Options = new Option[]{
new Option{OptionId=1, DisplayName="Green", OptionType = OptionType.Tea, SortOrder=100},
new Option{OptionId=2, DisplayName="Black", OptionType = OptionType.Tea, SortOrder=101},
new Option{OptionId=3, DisplayName="French", OptionType = OptionType.Coffee, SortOrder=202},
new Option{OptionId=4, DisplayName="Espresso", OptionType = OptionType.Coffee, SortOrder=206},
new Option{OptionId=4, DisplayName="Cappuccino", OptionType = OptionType.Coffee, SortOrder=250},
new Option{OptionId=1, DisplayName="Coke", OptionType = OptionType.Drinks, SortOrder=300},
new Option{OptionId=2, DisplayName="Pepsi", OptionType = OptionType.Drinks, SortOrder=301},
new Option{OptionId=3, DisplayName="Sprite", OptionType = OptionType.Drinks, SortOrder=302},
new Option{OptionId=4, DisplayName="Apple Juice", OptionType = OptionType.Drinks, SortOrder=406},
new Option{OptionId=1, DisplayName="Orange Juice", OptionType = OptionType.Drinks, SortOrder=400},
new Option{OptionId=2, DisplayName="Wine", OptionType = OptionType.Drinks, SortOrder=501},
new Option{OptionId=3, DisplayName="Beer", OptionType = OptionType.Drinks, SortOrder=502},
new Option{OptionId=4, DisplayName="Rum", OptionType = OptionType.Drinks, SortOrder=520}
};
return Options.ToArray();
}
public static Dictionary<int, string> GetOptionGroupNames()
{
Dictionary<int, string> optionGroups = new Dictionary<int, string>();
optionGroups.Add(1, "Tea");
optionGroups.Add(2, "Coffee");
optionGroups.Add(3, "Soda");
optionGroups.Add(4, "Juice");
optionGroups.Add(5, "Alcohol");
return optionGroups;
}
public class Option
{
public int OptionId { get; set; }
public string DisplayName { get; set; }
public OptionType OptionType { get; set; } //Three different types A,B,C
public int SortOrder { get; set; } //100-199, 200-299, etc.
}
public enum OptionType
{
Coffee,
Tea,
Drinks
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="rptrGroupOptions" runat="server" OnItemDataBound="rptrGroupOptions_ItemDataBound">
<ItemTemplate>
<asp:Label ID="lblOptionGroup" runat="server" ForeColor="Maroon"></asp:Label><br />
<asp:Repeater ID="rptrOptions" runat="server" OnItemDataBound="rptrOptions_ItemDataBound">
<ItemTemplate>
<asp:Label ID="lblOptionGroupNum" runat="server" ForeColor="Sienna"></asp:Label>
<asp:CheckBoxList ID="cblOptions" runat="server" DataTextField="DisplayName" DataValueField="OptionId"></asp:CheckBoxList>
</ItemTemplate>
</asp:Repeater>
<br />
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
Извините, я все еще пытаюсь заполучить Linq и GroupBy.
'GroupBy (x => x.SortOrder/100)'? – EZI
@ EZ1 попробовал это, но у меня возникли проблемы, поскольку я пытаюсь отобразить OptionType как заголовок, а OptionName привязывается к списку флажков. – gbs