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

事实是你分别为每个subcategorysubtest创建了另一个categorytest节点。

使用 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。