我在 SQL Server 中有一个表,我想将它加载到 WPF 中的树视图
类别 ID 名称 ParentID 1 服装 0
2 娱乐 0
3 税收 ... 1
4 电话 ... 2
5 租金 ... 3
6 旅行 ... 1
7 工资 ... 2
8 ABC ... 3
9 礼物 ... . 5
10 酷... 1
11 收入... 4
12 塔... 6
我在 C# 中的代码:
private void LoadTreeView()
{
SqlConnection con = new SqlConnection(s);
SqlCommand comm = new SqlCommand("SELECT * FROM Category", con);
SqlDataAdapter da = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
TreeViewItem tvi = new TreeViewItem();
AddNode(tvi, dt, 0);
con.Close();
}
private void AddNode(TreeViewItem tvi, DataTable dt, int node)
{
foreach (DataRow row in dt.Rows)
{
if ((int)row["ParentID"] == 0)
{
tvi = new TreeViewItem();
tvi.Header = row["Name"];
treeView.Items.Add(tvi);
DataTable dtb = dt;
node = (int)row["CategoryID"];
dtb.Rows.Remove(row);
AddNode(tvi, dtb, node);
}
else
{
int i = 0;
foreach (DataRow r in dt.Rows)
{
i++;
if ((int)r["ParentID"] == node)
{
TreeViewItem tvi2 = new TreeViewItem();
tvi2.Header = r["Name"];
tvi.Items.Add(tvi2);
DataTable dtb = dt;
node = (int)r["CategoryID"];
dtb.Rows.Remove(r);
if (dtb.Rows.Count == 0)
return;
AddNode(tvi2, dtb, node);
}
if (i == dt.Rows.Count)
return;
}
}
if (dt.Rows.Count == 0)
return;
}
}
但是在第二个 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"]);
}
}
}