搜索特定TreeViewItem的WPF Treeview

时间:2018-04-10 13:06:03

标签: c# wpf treeview

我正在使用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吗?

4 个答案:

答案 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可以同时搜索TreeViewTreeViewItem子项。这是我的代码:

    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;
    }