C# 在TreeView.Nodes集合中是否有搜索TreeNode.Text字段的方法?

C# 在TreeView.Nodes集合中是否有搜索TreeNode.Text字段的方法?,c#,winforms,treeview,treenode,C#,Winforms,Treeview,Treenode,像这样: TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true); 但是我希望它在文本字段中搜索,而不是在名称字段中搜索。我不知道有任何内置方法,但您可以使用LINQ TreeNode[] treeNodes = treeView.Nodes .Cast<TreeNode>()

像这样:

TreeNode[] treeNodes = treeView.Nodes.Find(searchString, true);

但是我希望它在
文本
字段中搜索,而不是在
名称
字段中搜索。

我不知道有任何内置方法,但您可以使用LINQ

TreeNode[] treeNodes = treeView.Nodes
                                    .Cast<TreeNode>()
                                    .Where(r => r.Text == "yourText")
                                    .ToArray();
TreeNode[]treeNodes=treeView.Nodes
.Cast()
.Where(r=>r.Text==“yourText”)
.ToArray();

如果我理解正确(您的最后一个问题非常混乱),您可以自己编写一个find方法,如下所示

public static TreeNode[] Find(this TreeNode motherNode, string findNodeText)
{
    List<TreeNode> nodeList = new List<TreeNode>();
    foreach (TreeNode childNode in motherNode.Nodes)
        if (childNode.Text.Equals(findNodeText, StringComparison.CurrentCulture))
            nodeList.Add(childNode);
    return nodeList.ToArray<TreeNode>();
}
我希望这有帮助。

要搜索所有树节点(而不仅仅是直接子节点),可以使用下面的扩展方法

var nodes = treeView1.FlattenTree()
                     .Where(n => n.Text == "sometext")
                     .ToList();
--

公共静态类SOExtension
{
公共静态IEnumerable树(此树视图电视)
{
返回扁平树(tv.Nodes);
}
公共静态IEnumerable Flattree(此TreeNodeCollection coll)
{
返回coll.Cast()
.Concat(coll.Cast)()
.SelectMany(x=>flattree(x.Nodes));
}
}

以下代码仅显示与搜索条件匹配的节点

在搜索事件中复制以下代码

   private void tbxSearch_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            trvMenu.BeginUpdate();
            if (tbxSearch.Text.Length > 0)
            {
                for (int i = trvMenu.Nodes.Count;  i > 0  ; i--)
                {
                    NodeFiltering(trvMenu.Nodes[i - 1], tbxSearch.Text);
                }
            }
            trvMenu.EndUpdate();
        }
然后创建serch&filter函数

    private bool NodeFiltering(TreeNode Nodo,string Texto)
    {
        bool resultado = false;

        if (Nodo.Nodes.Count == 0)
        {
            if (Nodo.Text.ToUpper().Contains(Texto.ToUpper()))
            {
                resultado = true;
            }
            else
            {
                Nodo.Remove();
            }
        }
        else
        {
            for (int i = Nodo.Nodes.Count; i > 0; i--)
            {
                if (NodeFiltering(Nodo.Nodes[i - 1], Texto))
                    resultado = true;
            }

            if (!resultado)
                Nodo.Remove();
        }

        return resultado;
    }

此代码非常适合创建具有多个级别的Treeview菜单。

var nodes
是一组具有
的节点。Text==“sometext”
,如何在该集中包含其子节点的其他父节点,因此,最终我将能够构建一棵树?非常好的解决方案:)它帮助我根据搜索文本过滤选择节点
treeview.SelectedNode=treeAccount.flattTree()。其中(p=>p.text.StartsWith(txtSearch.text.Trim()).FirstOrDefault()这比for循环更有效(更快)吗?不使用“Cast”可以完成吗?另外,这对树上的孩子不起作用。仅适用于根元素。问题要求查找“search children”(搜索子项)设置为true,但在文本字段而不是名称中,这一事实可能解释了相当简单的向下投票。由于我使用treeview显示类中的数据,因此我更喜欢检查类中的此类信息(平坦的)而不是树(包含很多分支)。@ThunderGr,比for循环快?我不能说,因为LINQ内部使用循环。即使有差异,它也可以忽略不计。是的,它不递归搜索,有一个递归解决方案。此方法不会搜索子节点
   private void tbxSearch_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            trvMenu.BeginUpdate();
            if (tbxSearch.Text.Length > 0)
            {
                for (int i = trvMenu.Nodes.Count;  i > 0  ; i--)
                {
                    NodeFiltering(trvMenu.Nodes[i - 1], tbxSearch.Text);
                }
            }
            trvMenu.EndUpdate();
        }
    private bool NodeFiltering(TreeNode Nodo,string Texto)
    {
        bool resultado = false;

        if (Nodo.Nodes.Count == 0)
        {
            if (Nodo.Text.ToUpper().Contains(Texto.ToUpper()))
            {
                resultado = true;
            }
            else
            {
                Nodo.Remove();
            }
        }
        else
        {
            for (int i = Nodo.Nodes.Count; i > 0; i--)
            {
                if (NodeFiltering(Nodo.Nodes[i - 1], Texto))
                    resultado = true;
            }

            if (!resultado)
                Nodo.Remove();
        }

        return resultado;
    }