Winform 树视图按标签查找节点
本文关键字:查找 节点 标签 视图 Winform | 更新日期: 2023-09-27 18:34:09
我有一个树视图,其中显示成员可能有重复项,而标签不会。 示例:
TreeNode node = new TreeNode(itemName);
node.Tag = itemID; //unique ID for the item
treeView1.Nodes.Add(node);
所以,在搜索时,我知道我可以使用
treeView1.Nodes.Find(itemName, true);
但是我该如何通过标签进行搜索呢?treeView1.Nodes.Where没有定义,所以对我来说没有linq:(
关于如何按标签搜索的任何建议? :)谢谢!
试试这个:
var result = treeView1.Nodes.OfType<TreeNode>()
.FirstOrDefault(node=>node.Tag.Equals(itemID));
注意:因为您说您的itemID
是唯一的,所以您可以使用FirstOrDefault
来搜索唯一项目。如果未找到,则将null
result
。
更新
要搜索所有级别的所有节点,您可以尝试使用一些递归方法,如下所示:
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;
}
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);
我会说这是一种更干净的处理方式。
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;
}
按 @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;
}