有没有在TreeView.Nodes集合中搜索TreeNode.Text字段的方法?

像这样:

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

但我希望它在text字段而不是name字段中搜索。

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

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

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

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

 public static class SOExtension { public static IEnumerable FlattenTree(this TreeView tv) { return FlattenTree(tv.Nodes); } public static IEnumerable FlattenTree(this TreeNodeCollection coll) { return coll.Cast() .Concat(coll.Cast() .SelectMany(x => FlattenTree(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和filterfunction

  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菜单。

如果我理解正确(你最后一个问题非常令人困惑),你可以自己编写一个find方法,如下所示

 public static TreeNode[] Find(this TreeNode motherNode, string findNodeText) { List nodeList = new List(); foreach (TreeNode childNode in motherNode.Nodes) if (childNode.Text.Equals(findNodeText, StringComparison.CurrentCulture)) nodeList.Add(childNode); return nodeList.ToArray(); } 

这种方法可以像

 TreeView myTreeView = new TreeView(); foreach (TreeNode node in myTreeView.Nodes) { TreeNode[] childNodes = node.Find("Text"); // Do something... } 

我希望这有帮助。