2011-06-09 72 views
0

我想根据前两个字符创建字符串的分层视图。当向treeview控件插入节点时防止重复

如果字符串: AAAA,AAAA,BBDD,AABB,AACC,BBDD,BBEE

我想reate一个TreeView,看起来像这样:

AA 
    AAAA 
    AABB 
    AACC 
BB 
    BBDD 
    BBEE 

目前,我有一些代码看起来像这样(的循环中的字符串内):

TreeNode pfxNode; 

    if (treeView1.Nodes[pfx]!=null) { 
     pfxNode = treeView1.Nodes[pfx]; 
    } 
    else { 
     pfxNode = treeView1.Nodes.Add(pfx); 
    } 

    if (!pfxNode.Nodes.ContainsKey(string)) { 
     pfxNode.Nodes.Add(string, string + " some info"); 
    } 

出于某种原因,这结束了在顶级多个“AA”的节点。
我错过了什么?

请不要预过滤字符串我想根据密钥检查特定的treenode是否存在。

感谢

回答

2
else { 
    pfxNode = treeView1.Nodes.Add(pfx); 
} 

有你的错误,你就忘记设置树节点的关键。所以下一个ContainsKey()将不会找到它。修复:

pfxNode = treeView1.Nodes.Add(pfx, pfx); 
+0

这绝对是我错过的。我预计pfx也将成为提供单个字符串时的关键。谢谢。 – epeleg 2011-06-11 14:01:33

0

使用此:

var q = from s in arr 
     group s by s.Substring(0, 2) into g 
     select new 
     { 
      Parent = g.Key, 
      Children = g.Select (x => x).Distinct() 
     }; 

foreach (var item in q) 
{ 
    var p = new TreeNode(item.Parent); 
    TreeView1.Nodes.Add(p); 
    foreach (var item2 in item.Children) 
     p.Nodes.Add(new TreeNode(item2)); 
} 
+0

虽然@Hans Passant提供的答案解决了我的问题我仍然对你的答案感兴趣。这是LINQ语法 - 对吗?你能提供一些关于这应该如何工作的细节吗?这个语法是否有任何性能或其他优势? – epeleg 2011-06-11 14:05:17

+0

我也无法运行将此代码添加到我的程序中,它似乎并不知道var是什么,并且一直说很多;这个文本块中没有。我应该安装一些东西来完成这项工作吗? – epeleg 2011-06-11 14:08:55

+0

@epeleg您需要.NET> = 3.5才能使Linq和'var'关键字正常工作。至于表现linq'group by'和'distinct'的操作相当不错。 – Magnus 2011-06-11 15:16:15