检查treeview是否包含一个项目

本文关键字:项目 包含一 是否 treeview 检查 | 更新日期: 2023-09-27 18:03:02

这个问题看起来很简单。我有一个树视图,我们叫它MyTreeView,填充了所有的驱动器号,树视图看起来是这样的
答:'
C: '
D: '
F: '

如何检查treeview是否包含特定项?树视图如何识别它的项目?我已经创建了一个MessageBox来显示MyTreeView.Items.GetItemAt(1),它将item 1标识为:
"System.Windows.Controls。TreeViewItem Header:C:' Items。数:1"

先尝试最简单的方法,这显然行不通:

if (MyTreeView.Items.Contains(@"C:'")
{
    MessageBox.Show(@"Tree contains C:'");
}

下一个最简单的事情是尝试做一个TreeViewItem看起来像我想要的,这也不工作:

TreeViewItem myItem = new TreeViewItem();
myItem.Header = @"C:'";
if (MyTreeView.Items.Contains(myItem)
{
    MessageBox.Show("Tree contains " + myItem.ToString());
}

只是为了确保我的基本概念是正确的,我尝试了一些循环逻辑,这实际上是有效的:

var myItem = MyTreeView.Items.GetItemAt(1);
if (MyTreeView.Items.Contains(myItem)
{
    MessageBox.Show("Tree contains " + myItem.ToString());
}

输出:
Tree包含System.Windows.Controls.TreeViewItem Header:C:' Items。数:1"

我做错了什么?我如何检查我的树是否包含类似"C:'"的内容?

编辑:
构建树的代码如下:
(基本上是从网上复制粘贴过来的)

        foreach (string myString in Directory.GetLogicalDrives())
        {
            TreeViewItem item = new TreeViewItem();
            item.Header = myString;
            item.Tag = myString;
            item.FontWeight = FontWeights.Normal;
            item.Items.Add(dummyNode); // this is (object)dummyNode = null
            item.Expanded += new RoutedEventHandler(DWGFolder_Expanded);
            item.Selected += new RoutedEventHandler(DWGFolder_Selected);
            // the Expanded event is very similar, 
            // subitem.Header is the folder name (Testing),
            // while subitem.Tag is the full path (C:'Testing)
            MyTreeView.Items.Add(item);
        }

我尝试匹配TreeViewItem对象

检查treeview是否包含一个项目

我相信. contains()将通过引用检查值,因为它不是一个简单的字符串对象。这要求您遍历每个项,直到检索到与标题匹配的项。

LINQ例子

    if (MyTreeView.Items.Cast<TreeViewItem>().Any(item => item.Header.ToString() == @"C:'"))
    {
       MessageBox.Show(@"Tree contains C:'");
    }

Contains在集合中查找完全相同的实例。如果您没有要检查的对象,则不能使用Contains

但是你可以使用一些基本的LINQ查询…将LINQ命名空间添加到您的类:

using System.Linq;

如果你的项目确实只是字符串,然后使用这个查询(编辑 -虽然,如果它们只是字符串,Contains 应该工作,因为它们的相等比较器不像那些常规引用类型,而是按值比较):

if (MyTreeView.Items.Cast<string>().Any(s => s == @"C:'"))
{
    // Do stuff
}

如果你的项目是treeviewitem,你可以使用这个:

if (MyTreeView.Items.Cast<TreeViewItem>().Any(i => i.Header.ToString() == @"C:'"))
{
    // Do stuff
}

但是你的条目可以是任何我们不知道的类,或者你的头绑定可以改变…在不知道如何向TreeView添加项目的情况下,很难给你最好的选择。

EDIT -记住,这将只搜索树的第一层。如果您要查找的物品放置在更深的地方,则必须进行递归搜索。在这种情况下,也许从一开始就把这些值存储在某个地方会更好。