2015-08-28 73 views
2

我正在寻找一个功能强大且简单的方法,以避免在一个TreeView重复的值,现在我以这种方式进行插入:如何避免在TreeView中重复的值?

while (rdr.Read()) 
{ 
    checkExists(rdr.GetString(3)); 
    rootNode.Items.Add(new TreeViewItem() { Header = rdr.GetString(3) }); 
} 

其中RDR是包含递归式的添加所有值机。现在,如果这些值已被添加,我会得到重复的值,所以我创建了一个函数checkExists,您应该检查该值是否已经在TreeView中。我还没有找到WPF的解决方案,我仍然在学习如何使用这个控件,我知道如何做到这一点。

public void checkExists(string campionato) 
{ 
     foreach (TreeView node in nation_team) 
     { 
      if (NodeExists(node, campionato)) 
      exists = true; 
     } 
} 

这种方法还没有准备好,它只是一个测试版。

private bool NodeExists(TreeNode node, string key) { 
     foreach (TreeNode subNode in node.Nodes) { 
      if (subNode.Text == key) { 
       return true; 
      } 
      if (node.Nodes.Count > 0) { 
       NodeExists(node, key); 
      } 
     } 
     return false; 
    } 

可能的解决方法,我试过,在foreach我试图通过所有节点进行迭代,但是编译器告诉我的GetEnumerator

+0

所以,你的checkExists方法有问题吗?将代码发布到 –

+0

哦对不起,我错过了将方法 – Bender

+0

后的代码粘贴到NodeExists? –

回答

0

如果我深知你的问题,你的NodeExists功能不管用。你看,你对第二种情况没有做任何事情,这就是为什么给你一个错误。此外,您还需要检查的subNode

妥善解决了孩子,会是这样:

private bool NodeExists(TreeNode node, string key) 
{ 
    foreach (TreeNode subNode in node.Nodes) 
    { 
     if (subNode.Text.Equals(key)) 
     { 
      return true; 
     } 

     var nodeChildExists = NodeExists(subNode.Nodes, key); 

     if(nodeChildExists) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+0

此解决方案适用于不适用于wpf的Windows窗体 – Bender

0

走出的几乎头部敲这个算法,因为他们在WPF,特别是新的后我从来没有在TreeView的工作,我做的:

var newHeader = rdr.GetString(3); //it is a reader that contains the current node, for example "Home" 
var exists = false; 

foreach (TreeViewItem item in rootNode.Items) //iterate through all nodes 
{ 
     var header = item.Header; 

     if (header.Equals(newHeader)) 
     { 
      Console.WriteLine("Item already inserted!!"); 
      exists = true; 
      break; 
     } 
} 

if (!exists) 
{ 
     rootNode.Items.Add(new TreeViewItem() { Header = newHeader }); 
} 

这很适合我,我会留反正我的问题的情况下,开有人发现一个更好的解决方案比我更优化的,哦,是的。我是一个疯狂的优化。如果你能把所有东西都缩小到一行代码,那么......我会的。