C# 检查treeview是否包含项目

C# 检查treeview是否包含项目,c#,wpf,C#,Wpf,这个问题似乎很简单。我有一个树状视图,我们称之为MyTreeView,填充了所有的驱动器号,因此树状视图如下所示: 答:\ C:\ D:\ F:\ 如何检查treeview是否包含特定项?treeview如何识别其项目? 我创建了一个MessageBox来显示MyTreeView.Items.GetItemAt(1),它将项目1标识为: “System.Windows.Controls.TreeView项目标题:C:\Items.Count:1” 首先尝试最简单的方法,这显然不起作用: if (

这个问题似乎很简单。我有一个树状视图,我们称之为MyTreeView,填充了所有的驱动器号,因此树状视图如下所示:
答:\
C:\
D:\
F:\

如何检查treeview是否包含特定项?treeview如何识别其项目? 我创建了一个MessageBox来显示MyTreeView.Items.GetItemAt(1),它将项目1标识为:
“System.Windows.Controls.TreeView项目标题:C:\Items.Count:1”

首先尝试最简单的方法,这显然不起作用:

if (MyTreeView.Items.Contains(@"C:\")
{
    MessageBox.Show(@"Tree contains C:\");
}
TreeViewItem myItem = new TreeViewItem();
myItem.Header = @"C:\";
if (MyTreeView.Items.Contains(myItem)
{
    MessageBox.Show("Tree contains " + myItem.ToString());
}
下一个最简单的方法是尝试制作一个看起来与我想要的类似的TreeViewItem,但它也不起作用:

if (MyTreeView.Items.Contains(@"C:\")
{
    MessageBox.Show(@"Tree contains C:\");
}
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());
}
哪些输出:
“树包含System.Windows.Controls.TreeViewItem标题:C:\Items。计数:1”

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

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


因此,我基本上是在尝试匹配TreeViewItem对象。

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

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

using System.Linq;
如果您的项目确实只是字符串,则使用此查询(编辑-但是,如果它们只是字符串,
包含
应该可以工作,因为它们的相等比较器与常规引用类型的相等比较器不同,而是按值进行比较):

if(MyTreeView.Items.Cast().Any(s=>s==@“C:\”)
{
//做事
}
如果您的项目是TreeView项目,则可以使用此项目:

if (MyTreeView.Items.Cast<TreeViewItem>().Any(i => i.Header.ToString() == @"C:\"))
{
    // Do stuff
}
if(MyTreeView.Items.Cast().Any(i=>i.Header.ToString()==@“C:\”)
{
//做事
}
但是您的项目可以是我们不知道的任何类,或者您的标题绑定可能会更改。。。如果不知道如何将项目添加到树状视图中,就很难为您提供最佳选择


编辑-请记住,这只会在树的第一级进行搜索。如果要查找的项目位于更深的位置,则必须进行递归搜索。在这一点上,也许从一开始就将存储的值保留在某个位置会更好。

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

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

using System.Linq;
如果您的项目确实只是字符串,则使用此查询(编辑-但是,如果它们只是字符串,
包含
应该可以工作,因为它们的相等比较器与常规引用类型的相等比较器不同,而是按值进行比较):

if(MyTreeView.Items.Cast().Any(s=>s==@“C:\”)
{
//做事
}
如果您的项目是TreeView项目,则可以使用此项目:

if (MyTreeView.Items.Cast<TreeViewItem>().Any(i => i.Header.ToString() == @"C:\"))
{
    // Do stuff
}
if(MyTreeView.Items.Cast().Any(i=>i.Header.ToString()==@“C:\”)
{
//做事
}
但是您的项目可以是我们不知道的任何类,或者您的标题绑定可能会更改。。。如果不知道如何将项目添加到树状视图中,就很难为您提供最佳选择

编辑-请记住,这只会在树的第一级进行搜索。如果要查找的项目位于更深的位置,则必须进行递归搜索。在这一点上,也许从一开始就将值保存在某个位置会更好。

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

LINQ示例

    if (MyTreeView.Items.Cast<TreeViewItem>().Any(item => item.Header.ToString() == @"C:\"))
    {
       MessageBox.Show(@"Tree contains C:\");
    }
if(MyTreeView.Items.Cast().Any(item=>item.Header.ToString()==@“C:\”)
{
Show(@“树包含C:\”);
}
我相信.Contains()会通过引用检查值,因为它不是一个简单的字符串对象。这要求您遍历每个项,直到检索到与标题匹配的项为止

LINQ示例

    if (MyTreeView.Items.Cast<TreeViewItem>().Any(item => item.Header.ToString() == @"C:\"))
    {
       MessageBox.Show(@"Tree contains C:\");
    }
if(MyTreeView.Items.Cast().Any(item=>item.Header.ToString()==@“C:\”)
{
Show(@“树包含C:\”);
}

你的第二个不起作用的原因是你的树视图显然不包含你刚刚创建的项目。你的第三种方法非常接近。你说过它可以工作,为什么不继续构建它呢?你可以在树视图中为对象指定一个名称,然后使用
.FindName
-第二个不工作的原因是树视图显然不包含你刚刚创建的项。你的第三种方法非常接近。您说过它可以工作,为什么不继续构建它呢?您可以在树视图中为对象指定一个名称,然后使用
.FindName
-我认为您应该检查带有项目标题的字符串。否则它将无法工作。您的代码无法工作,因为“无法将System.Windows.Controls.TreeViewItem类型的对象强制转换为System.String类型”,但我认为您的思路是正确的。谢谢你的主意!Items不返回TreeViewItems列表,它返回实际数据。这就是为什么我说“如果你的项目确实只是字符串”。他们也可能是一个完全不同的类,就此而言…@Shawncarincuck你能在你的问题中添加一段代码吗?你实际上是在将项目添加到树视图中吗?谢谢你的帮助;你让我想了很多。我愚蠢地认为树视图只能包含树视图项。如果编译器没有做出这样的假设,它就可以解释为什么它不知道我要做什么。您的解决方案非常有效!我认为您应该检查带有项目标题的字符串。否则它将无法工作。您的代码无法工作