这个问题看起来很简单。我有一个树视图,我们称之为MyTreeView,填充了所有的驱动器号,因此树视图看起来像这样:
答:\
C:\
D:\
F:\
如何检查树视图是否包含特定项目? treeview如何识别其项目?
我创建了一个MessageBox来显示MyTreeView.Items.GetItemAt(1),它将项目1标识为:
“System.Windows.Controls.TreeViewItem Header:C:\ Items.Count: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标题:C:\ Items.Count: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对象。
答案 0 :(得分:4)
我相信.Contains()会通过引用来检查值,因为它不是一个简单的字符串对象。这需要您遍历每个项目,直到您检索与标题匹配的项目。
LINQ示例
ElementCollection
答案 1 :(得分:1)
Contains
在集合中查找完全相同的实例。如果您还没有要检查的对象,则无法使用Contains
。
但您可以使用一些基本的LINQ查询...将LINQ命名空间添加到您的类:
using System.Linq;
如果您的商品确实只是字符串,那么请使用此查询(编辑 - 但是,如果它们只是字符串,Contains
应该工作,因为它们的相等比较器的行为与常规引用类型不同,但按值比较):
if (MyTreeView.Items.Cast<string>().Any(s => s == @"C:\"))
{
// Do stuff
}
如果你的项目是TreeViewItems,你可以使用这个:
if (MyTreeView.Items.Cast<TreeViewItem>().Any(i => i.Header.ToString() == @"C:\"))
{
// Do stuff
}
但是您的项目可能是我们不知道的任何类,或者您的标题绑定可能会更改...如果不知道如何将项目添加到TreeView,很难为您提供最佳选择。
编辑 - 请记住,这只会在树的第一级搜索。如果您要查找的项目位于更深处,则必须进行递归搜索。那时,也许只是保持从一开始就存储的值会更好。