![](/img/trans.png)
[英]How to create datatable column dynamically using Enumerable.Range?
[英]Distinct Enumerable DataTable based on column?
這就是我想要完成的。 我只想從Column [0]中的所有行中選擇唯一的值。
然后,我想從column [2]獲取所有不同的值,並將它們分組在column [0]上。
所以基本上我有一個DataTable像這樣:
Fruit|Apples
Fruit|Pears
Vegetables|Peas
Vegetables|Carrots
因此,我想對不同的值進行介紹,因此我將枚舉一次水果,然后拾取蘋果和梨,再將VegeTables拾取,然后拾取豌豆和胡蘿卜。
我這樣做是為了創建“手風琴窗格”,在這里我想將結果分組到一個標題下,下面的代碼這樣做了,但是,它創建了兩個Fruit窗格,因為它沒有意識到它已經通過了Fruit。
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);
}
使用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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.