从SQL Server加载C#中的TreeView递归

从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”的未处理异常 附加信息:集合已修改;枚

我在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”的未处理异常

附加信息:集合已修改;枚举操作可能无法执行

我怎样才能修好它

编辑:我已经修好了

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();