C#TreeView重复节点和子节点

时间:2018-10-04 11:23:45

标签: c# treeview devexpress nodes

我创建了一个树状视图,但是有问题。

在我的代码节点中像这样重复添加;

treeview

treeview

我该如何解决和编码此问题?

我的数据是

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

3 个答案:

答案 0 :(得分:0)

TreeView不能像字典一样工作

如果您想要这种行为,则需要自己正确构建树。

如果停留在两层,那么事情就很容易了:只需使用new Dictionary<string, List<string>>();并添加子类别即可。

稍后,您可以遍历字典中的项目,并相应地创建子节点。

答案 1 :(得分:0)

您应该检查具有相同文本的现有节点并重新使用它,并仅在必要时创建一个新节点。

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

答案 2 :(得分:0)

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

使用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不确定,和/或需要更多说明,请告诉我。