C# TreeView 重复节点和子节点
C# TreeView duplicate nodes and child
我创建了树视图,但遇到问题。
在我的代码中节点是这样重复添加的;
我该如何解决这个问题并编写代码?
我的数据是;
Column1 Column2
category subcategory
category subcategory2
category subcategory3
test subtest
test subtest2
我的代码;
SqlConnection con = new SqlConnection("Data Source=test;Initial Catalog=test;Integrated Security=True;");
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("select * from mytable", con);
da.Fill(dt);
treeView1.Nodes.Add("Documents");
foreach (DataRow dr in dt.Rows)
{
TreeNode nod = new TreeNode(dr["kategori"].ToString());
nod.Nodes.Add(dr["altkategori"].ToString());
treeView1.Nodes.Add(nod);
}
TreeView 不像字典那样工作
如果你想要这样的行为,你需要自己正确地构建树。
如果它停留在两层,事情就相当简单:只需使用 new Dictionary<string, List<string>>();
并添加您的子类别。
稍后,您可以遍历字典中的项目,并相应地创建子节点。
您应该检查具有相同文本的现有节点并重新使用它,并且只在必要时创建一个新节点。
foreach (DataRow dr in dt.Rows)
{
TreeNode nod = treeView1.Nodes.Find(dr["kategori"].ToString());
if (nod == null)
{
nod = new TreeNode(dr["kategori"].ToString());
treeView1.Nodes.Add(nod);
}
nod.Nodes.Add(dr["altkategori"].ToString());
}
事实是你分别为每个subcategory
和subtest
创建了另一个category
和test
节点。
使用 LINQ GroupBy method 会将您的 altkategori
分组到同一个 kategori
节点中:
treeView1.Nodes.Add("Documents");
foreach (IGrouping<string, string> kategori in dt.Rows.Cast<DataRow>().GroupBy(dr => dr["kategori"].ToString(), dr => dr["altkategori"].ToString()))
{
TreeNode nod = new TreeNode(kategori.Key); // node with kategori text
foreach (string altkategori in kategori) // foreach subnode in kategori
nod.Nodes.Add(altkategori); // add another altkategori node in
treeView1.Nodes.Add(nod); // add your final kategori node
}
如果您对 LINQ 没有信心,请告诉我,如果您需要更多解释,and/or。
我创建了树视图,但遇到问题。
在我的代码中节点是这样重复添加的;
我该如何解决这个问题并编写代码?
我的数据是;
Column1 Column2
category subcategory
category subcategory2
category subcategory3
test subtest
test subtest2
我的代码;
SqlConnection con = new SqlConnection("Data Source=test;Initial Catalog=test;Integrated Security=True;");
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("select * from mytable", con);
da.Fill(dt);
treeView1.Nodes.Add("Documents");
foreach (DataRow dr in dt.Rows)
{
TreeNode nod = new TreeNode(dr["kategori"].ToString());
nod.Nodes.Add(dr["altkategori"].ToString());
treeView1.Nodes.Add(nod);
}
TreeView 不像字典那样工作
如果你想要这样的行为,你需要自己正确地构建树。
如果它停留在两层,事情就相当简单:只需使用 new Dictionary<string, List<string>>();
并添加您的子类别。
稍后,您可以遍历字典中的项目,并相应地创建子节点。
您应该检查具有相同文本的现有节点并重新使用它,并且只在必要时创建一个新节点。
foreach (DataRow dr in dt.Rows)
{
TreeNode nod = treeView1.Nodes.Find(dr["kategori"].ToString());
if (nod == null)
{
nod = new TreeNode(dr["kategori"].ToString());
treeView1.Nodes.Add(nod);
}
nod.Nodes.Add(dr["altkategori"].ToString());
}
事实是你分别为每个subcategory
和subtest
创建了另一个category
和test
节点。
使用 LINQ GroupBy method 会将您的 altkategori
分组到同一个 kategori
节点中:
treeView1.Nodes.Add("Documents");
foreach (IGrouping<string, string> kategori in dt.Rows.Cast<DataRow>().GroupBy(dr => dr["kategori"].ToString(), dr => dr["altkategori"].ToString()))
{
TreeNode nod = new TreeNode(kategori.Key); // node with kategori text
foreach (string altkategori in kategori) // foreach subnode in kategori
nod.Nodes.Add(altkategori); // add another altkategori node in
treeView1.Nodes.Add(nod); // add your final kategori node
}
如果您对 LINQ 没有信心,请告诉我,如果您需要更多解释,and/or。