C# WinForm TreeView控件查找指定节点及各级子节点问题
WinForm TreeView全层级节点遍历解决方案
问题本质
原代码仅遍历TreeView.Nodes根节点集合,未访问每个TreeNode自带的Nodes子节点集合,因此只能匹配到一级根节点,无法检索到深层级的子/孙节点。
方案1:递归扩展方法(最易用)
将全节点遍历封装为TreeView的扩展方法,可直接链式调用:
public static class TreeViewExtensions { /// <summary> /// 获取TreeView控件内所有层级的节点 /// </summary> public static IEnumerable<TreeNode> GetAllNodes(this TreeView treeView) { foreach (TreeNode rootNode in treeView.Nodes) { yield return rootNode; foreach (var childNode in GetChildNodes(rootNode)) { yield return childNode; } } } /// <summary> /// 递归获取指定节点下的所有子节点 /// </summary> private static IEnumerable<TreeNode> GetChildNodes(TreeNode parentNode) { foreach (TreeNode childNode in parentNode.Nodes) { yield return childNode; foreach (var grandChild in GetChildNodes(childNode)) { yield return grandChild; } } } }
使用示例
// 模糊匹配所有文本包含specificPTN的节点 TreeNode[] matchedNodes = Repository_TreeView.GetAllNodes() .Where(r => r.Text.Contains(specificPTN)) .ToArray(); // 找到第一个匹配节点并设为选中 var targetNode = Repository_TreeView.GetAllNodes() .FirstOrDefault(r => r.Text == specificPTN); if (targetNode != null) { Repository_TreeView.SelectedNode = targetNode; targetNode.EnsureVisible(); // 自动展开到该节点 }
方案2:非递归遍历(避免栈溢出)
如果TreeView节点层级极深,可使用广度优先的非递归实现:
public List<TreeNode> GetAllTreeNodes(TreeView treeView) { List<TreeNode> allNodes = new List<TreeNode>(); Queue<TreeNode> traverseQueue = new Queue<TreeNode>(); // 初始化队列,加入所有根节点 foreach (TreeNode root in treeView.Nodes) { traverseQueue.Enqueue(root); } while (traverseQueue.Count > 0) { TreeNode current = traverseQueue.Dequeue(); allNodes.Add(current); // 把子节点加入队列等待遍历 foreach (TreeNode child in current.Nodes) { traverseQueue.Enqueue(child); } } return allNodes; }
内容的提问来源于stack exchange,提问作者st4ticv0id
相关产品推荐
相关产品推荐

