有没有在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... }
我希望这有帮助。