这就是我想要完成的事情。我想只从列[0]中的所有行中选择不同的值。
然后我想从列[2]中获取所有不同的值,并将它们分组到列[0]上。
基本上我有一个像这样的DataTable:
Fruit|Apples
Fruit|Pears
Vegetables|Peas
Vegetables|Carrots
所以我想对不同的值做一个foreach,所以我会枚举Fruit一次,然后拿起苹果和梨,和VegeTables一次,拿起豆豆和胡萝卜。
我这样做是为了创建Accordion Panes,我想在一个标题下将我的结果分组,下面的代码会这样做,但是,它会创建两个Fruit的窗格,因为它没有意识到它已经通过了水果。 / p>
foreach (DataRow dtrow in dtTable.Rows)
{
string idRow = dtrow[0].ToString();
AccordionPane currentPane = new AccordionPane();
currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString();
currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString()));
foreach(DataRow dtRow2 in dtTable.Rows)
{
if(dtRow2[0].ToString() == idRow)
{
currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString()));
}
}
NavigateAccordion.Panes.Add(currentPane);
}
答案 0 :(得分:0)
使用linq时可以轻松完成此操作,请亲自看看:
var groupedRows = from row in dtTable.Rows.AsEnumerable()
group row by row[0] into grouped
select grouped;
foreach (var group in groupedRows)
{
currentPane = new AccordionPane();
currentPane.HeaderContainer.Controls.Add(group.Key.ToString());
foreach (var row in group)
{
currentPane.ContentContainer.Controls.Add(row[1].ToString());
}
}
或者如果您想坚持使用当前的非linq方法:
foreach (DataRow dtrow in dtTable.Rows)
{
bool skip = false;
foreach (var pane in NavigateAccordion.Panes)
{
if (pane.HeaderContainer.Controls[0].Text == dtRow[0].ToString())
{
skip = true;
break;
}
}
if (!skip)
{
string idRow = dtrow[0].ToString();
AccordionPane currentPane = new AccordionPane();
currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString();
currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString()));
foreach(DataRow dtRow2 in dtTable.Rows)
{
if(dtRow2[0].ToString() == idRow)
{
currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString()));
}
}
NavigateAccordion.Panes.Add(currentPane);
}
}