如何避免TreeView中的重复值?

时间:2015-08-28 15:14:43

标签: c# wpf

我正在寻找一种强大而简单的方法来避免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;
    }

我尝试过的可能的解决方案,我试图遍历所有节点,但编译器告诉我有关GetEnumerator的信息

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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 });
 }

这对我来说效果很好,无论如何我会留下我的问题,以防有人找到比我更好的解决方案并且更优化,哦是的..我是一个狂热的优化。如果你可以将所有内容减少到一行代码,那么......我会的。