我正在使用wpf TreeView
。我正在尝试搜索TreeView
中的所有项目,以便在其中找到所需的TreeViewItem
。
parent
是我要搜索的所需项目标题的string
。
foreach (TreeViewItem item in treeView.Items)
{
if (item.Header.ToString().Contains(parent))
{
//Do Something to item that is found
}
}
我对此代码的问题在于它会搜索TreeView
的前两层。如果item
中的item
内有TreeView
,则找不到item
。话虽如此,我已添加到我的代码中,但它只会将问题延长到TreeView
。
foreach (TreeViewItem item in treeView.Items)
{
foreach(TreeViewItem subItem in item.Items)
{
if (subItem.Header.ToString().Contains(parent))
{
//Do Something to item that is found
}
}
if (item.Header.ToString().Contains(parent))
{
//Do Something to item that is found
}
}
有没有办法搜索整个TreeView
及其中的所有items
?我可以递归搜索TreeView
吗?
答案 0 :(得分:2)
你应该考虑递归。 从本质上讲,您需要一种采用treeviewitem并遍历其所有子项的方法。 对于每个方法,该方法调用自己,传入子进程。 如果你从来没有这样做过,那么当你第一次看到它时,它会有点融化。了解原理。 但粗略地说:
private void recurseItem(TreeViewItem item)
{
foreach (var subItem in item.Items)
{
// compare header and return that item if you find it
if(!gotTheItem)
recurseItem(subItem);
}
}
你需要一个foreach循环遍历树的顶级项目,每个项目都会传递给它。 不要粘贴它(你只是学习剪切和粘贴然后)读取递归并思考它。 请注意,您需要通过设置一个bool标志来表示找到该项目,并避免迭代所有其余项目。
请注意,此代码主要是为了介绍递归概念的新手。它不是一种理想的剪切和粘贴解决方案 如果您使用绑定树视图尝试此操作,那么您将发现Items集合包含您绑定的对象而不是treeviewitems。
答案 1 :(得分:1)
Andy的解决方案将满足您的需求,但更通用和可重复使用的解决方案是使用ItemCollection
进行迭代。通过这种方式,您可以传递任何继承ItemCollection
的对象类型,同时避免不存在的子项的异常。如果您的树中有不同类型的孩子,那就太棒了。
private void IterateTree(ItemCollection items)
{
//Iterate each item
foreach (var item in items)
{
//Your IF logic here
//Iterate again if item contains sub items.
if (item is ItemsControl)
{
ItemsControl ic = (ItemsControl)item;
IterateTree(ic.Items); //Recursive call
}
}
}
答案 2 :(得分:0)
我做了两个递归方法。第一个最初搜索TreeView
所需的项目,然后第二个搜索每个item
,直到找到所需的项目。然后该方法返回了我能够操作的所需项目,就像我想要的那样。
/// <summary>
/// Recursivly search the treeview until desired TreeViewItem is found
/// </summary>
/// <param name="_treeView"></param>
/// <param name="_parent"></param>
/// <returns></returns>
private TreeViewItem SearchTreeView(TreeView _treeView, string _parent)
{
TreeViewItem foundItem = null;
foreach (TreeViewItem item in _treeView.Items)
{
if (item.Header.ToString().Contains(_parent))
{
foundItem = item;
}
else
{
foundItem = SearchTreeView(item, _parent);
}
}
return foundItem;
}
/// <summary>
/// Recursivly search the treeviewitem until desired TreeViewItem is found
/// </summary>
/// <param name="_item"></param>
/// <param name="_parent"></param>
/// <returns></returns>
private TreeViewItem SearchTreeView(TreeViewItem _item, string _parent)
{
TreeViewItem foundItem = null;
foreach (TreeViewItem subItem in _item.Items)
{
if (subItem.Header.ToString().Contains(_parent))
{
foundItem = subItem;
}
else
{
foundItem = SearchTreeView(subItem, _parent);
}
}
return foundItem;
}
答案 3 :(得分:0)
使用ItemsControl
可以同时搜索TreeView
和TreeViewItem
子项。这是我的代码:
private TreeViewItem SearchTreeView(ItemsControl item, string header)
{
TreeViewItem foundItem = null;
foreach (TreeViewItem subItem in item.Items)
foundItem = subItem.Header.ToString().Contains(header) ? subItem : SearchTreeView(subItem, header);
return foundItem;
}