如何在Windows窗体TreeView中按标记选择节点

我正在尝试按标签选择节点。 我已经搜索了我能做什么,但仍然没有运气。 我用它来为我的treeview每个节点分配一个标签

  foreach (DataRow dataRow in databaseFunc.dataTable.Rows) { TreeNode nodes = new TreeNode(); nodes.Text = dataRow["LastName"].ToString().Trim() + ", " + dataRow["FirstName"].ToString().Trim(); nodes.Tag = dataRow[0].ToString().Trim(); treeView.Nodes.Add(nodes); } 

我知道您可以使用以下方法选择节点:

  TreeNodeCollection nodeCollect = treeView.Nodes; treeView.SelectedNode = nodeCollect[index]; 

按标签查找

Tag包含复杂对象或您希望基于非字符串键查找时,通过Tag查找非常有用。

为了能够搜索子节点,您可以在此处查看答案并使用Descendants扩展方法查找包括子节点在内的所有节点。 然后,您可以按Tag找到节点。 例如,如果Tag包含Product并且您希望根据其Id找到产品,则可以使用以下代码:

 var result = tree.Descendants().Where(x=>((x.Tag as Product) != null) && (x.Tag as Product).Id = someId).FirstOrDefault(); 

或者对于简单的字符串搜索键:

 var result = tree.Descendants().Where(x=>(x.Tag as string) == searchkey).FirstOrDefault(); if(result!=null) tree.SelectedNode = result; 

如果要仅在根节点之间进行搜索,请使用:

 var result = tree.Nodes.Cast().Where(... the rest is like above. 

按名称查找

您可以使用Find方法的Nodes集合来查找基于其Name (而不是文本)的节点。 当您想要根据字符串键查找节点时,使用Find方法很有用。 为此,您应在创建节点时设置节点的Name

 var result = tree.Nodes.Find(searchKey , true).FirstOrDefault(); if(result !=null) tree.SelectedNode = result; 

如果要仅在根节点之间进行搜索,请使用:

 var result = tree.Nodes.Find(searchKey , false).FirstOrDefault(); 

注意

作为结论,您可以使用Tag属性在Tag中存储复杂对象,并在需要时将其解包。 对于字符串搜索键,最好使用注释中所述的Name属性。