Winform Treeview按标签查找节点

我有一个树视图,显示成员可能有重复,标签不会。 例:

TreeNode node = new TreeNode(itemName); node.Tag = itemID; //unique ID for the item treeView1.Nodes.Add(node); 

因此,在搜索时,我知道我可以使用itemName搜索

 treeView1.Nodes.Find(itemName, true); 

但我怎么能通过标签搜索? treeView1.Nodes.Where没有定义,所以对我来说没有linq 🙁

有关如何按标签搜索的任何建议? :) 谢谢!

试试这个:

 var result = treeView1.Nodes.OfType() .FirstOrDefault(node=>node.Tag.Equals(itemID)); 

注意 :因为您说您的itemID是唯一的,所以您可以使用FirstOrDefault搜索唯一项目。 如果未找到,则resultnull

UPDATE

要搜索所有级别的所有节点,您可以尝试使用一些递归方法,如下所示:

 public TreeNode FromID(string itemId, TreeNode rootNode){ foreach(TreeNode node in rootNode.Nodes){ if(node.Tag.Equals(itemId)) return node; TreeNode next = FromID(itemId, node); if(next != null) return next; } return null; } //Usage TreeNode itemNode = null; foreach(TreeNode node in treeView1.Nodes){ itemNode = FromID(itemId, node); if(itemNode != null) break; } 
  public TreeNode GetNode(string name, TreeNode rootNode) { foreach (TreeNode node in rootNode.Nodes) { if (node.Name.Equals(name)) return node; TreeNode next = GetNode(name, node); if (next != null) return next; } return null; } public TreeNode GetNode(string name) { TreeNode itemNode = null; foreach (TreeNode node in treeViewPermission.Nodes) { if (node.Name.Equals(name)) return node; itemNode = GetNode(name, node); if (itemNode != null) break; } return itemNode; } 

Name属性可能是一个更好的答案。 http://msdn.microsoft.com/en-us/library/system.windows.forms.treenode.name(v=vs.110).aspx

 var itemNode = new TreeNode(itemName); itemNode.Name = itemID.ToString(); treeView1.Nodes.Add(node); var insertedNode = treeView1.Nodes.Find(itemID.ToString(), true); 

我想说这是一种更清洁的方式来处理它。

通过@Hamix的标签版本

  public TreeNode GetNode(object tag, TreeNode rootNode) { foreach (TreeNode node in rootNode.Nodes) { if (node.Tag.Equals(tag)) return node; //recursion var next = GetNode(tag, node); if (next != null) return next; } return null; } public TreeNode GetNode(object tag) { TreeNode itemNode = null; foreach (TreeNode node in _sourceTreeView.Nodes) { if (node.Tag.Equals(tag)) return node; itemNode = GetNode(tag, node); if (itemNode != null) break; } return itemNode; }