从SQL Server加载C#中的TreeView递归
我在SQL Server中有一个表,我想将它加载到WPF中的treeview 类别ID名称ParentID 1服装0从SQL Server加载C#中的TreeView递归,c#,sql,wpf,treeview,C#,Sql,Wpf,Treeview,我在SQL Server中有一个表,我想将它加载到WPF中的treeview 类别ID名称ParentID 1服装0 2娱乐0 三税。。。1 4电话。。。2 5租金。。。3 6旅行。。。1 7薪水。。。2 8 ABC。。。3 9.礼物。。。5 10酷。。。1 11收入。。。4 12号楼。。。六, 我的C#代码: 但在第二个foreach中运行时出错 System.Data.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:集合已修改;枚
2娱乐0
三税。。。1
4电话。。。2
5租金。。。3
6旅行。。。1
7薪水。。。2
8 ABC。。。3
9.礼物。。。5
10酷。。。1
11收入。。。4
12号楼。。。六, 我的C#代码: 但在第二个foreach中运行时出错 System.Data.dll中发生类型为“System.InvalidOperationException”的未处理异常 附加信息:集合已修改;枚举操作可能无法执行 我怎样才能修好它 编辑:我已经修好了
private void AddNode(TreeViewItem tvi, DataTable dt, int node)
{
foreach (DataRow row in dt.Rows)
{
if ((int)row["ParentID"] != 0 && (int)row["ParentID"] == node)
{
TreeViewItem tvi2 = new TreeViewItem();
tvi2.Header = row["Name"];
tvi.Items.Add(tvi2);
DataTable dt2 = dt.Copy();
int i = 0;
for (i = 0; i < dt.Rows.Count - 1; i++)
{
if (row["CategoryID"] == dt.Rows[i]["CategoryID"])
break;
}
if (dt2.Rows.Count == 1)
return;
dt2.Rows.RemoveAt(i);
AddNode(tvi2, dt2, (int)row["CategoryID"]);
}
else if ((int)row["ParentID"] == 0 && node == 0)
{
tvi = new TreeViewItem();
tvi.Header = row["Name"];
treeView.Items.Add(tvi);
DataTable dt2 = dt.Copy();
int i = 0;
for (i = 0; i < dt.Rows.Count - 1; i++)
{
if ((int)row["CategoryID"] == (int)dt.Rows[i]["CategoryID"])
break;
}
if (dt2.Rows.Count == 1)
return;
dt2.Rows.RemoveAt(i);
AddNode(tvi, dt2, (int)row["CategoryID"]);
}
}
}
private void AddNode(树视图项tvi、数据表dt、int节点)
{
foreach(数据行中的数据行)
{
如果((int)行[“ParentID”]!=0&(int)行[“ParentID”]==node)
{
TreeViewItem tvi2=新的TreeViewItem();
tvi2.Header=行[“名称”];
tvi.Items.Add(tvi2);
DataTable dt2=dt.Copy();
int i=0;
对于(i=0;i
您正在修改在dt.Rows循环中操作的数据表
当你说
DataTable dtb = dt;
它正在创建指向同一表的另一个链接,而不是创建新表。因此,当您修改dtb时,您也在修改dt(实际上dt和dtb是同一个表的两个名称)
由于这张桌子相当小,你也许能逃脱处罚
DataTable dtb = dt.Clone();
这将创建表的副本,而不仅仅是同一表的别名
但是,我不明白为什么您首先要从dtb中删除一行。由于您是在本地确定它的作用域,并且没有在作用域内再次使用该表,因此这似乎是一个无意义的操作。由于dtb在原始代码中只是一个别名,因此您可以在dt上使用dtb执行所有操作,并获得完全相同的结果。请详细说明您收到的错误。编辑错误详细信息。谢谢你的关心。
DataTable dtb = dt.Clone();