我有以下两种方法,它们循环一个 TreeView 或 TreeNode ,
private TreeNode SearchNode(string nodetext, TreeNode node)
{
foreach (TreeNode nd in node.Nodes)
{
if (nd.Text == nodetext)
{
return nd;
}
}
return null;
}
private TreeNode SearchParentNode(string nodetext, TreeView trv)
{
foreach (TreeNode node in trv.Nodes)
{
if (node.Text == nodetext)
{
return node;
}
}
return null;
}
需要一个可以在 a 中搜索值的方法NodesCollection,因此只需将两个方法的内容提取到一个接受 a 的第三个方法中NodesCollection:
private TreeNode SearchNodes(string nodeText, TreeNodesCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (node.Text == nodeText)
{
return node;
}
}
return null;
}
并将它传递给您要搜索的任何集合:
return SearchNodes(nodetext, node.Nodes);
return SearchNodes(nodetext, trv.Nodes);
此外,您可以使用 LINQ 将该方法简化为SearchNodes一行:
private TreeNode SearchNodes(string nodeText, TreeNodesCollection nodes)
{
return nodes.Cast<TreeNode>().FirstOrDefault(n => n.Text == nodeText);
}
类似于树的数据结构最好使用递归算法进行搜索。这可能看起来像:
public static TreeNode SearchNode(string tofind, TreeNodeCollection nodes) {
foreach (TreeNode node in nodes) {
if (node.Text == tofind) return node;
var nested = SearchNode(tofind, node.Nodes);
if (nested != null) return nested;
}
return null;
}
示例用法:
var node = SearchNode("foo", treeView1.Nodes);
if (node != null) {
node.Expand();
node.EnsureVisible();
}
请注意这适用于任何TreeView,而不仅仅是仅限于单个父子关系的 TreeView。这是一种深度优先搜索,按照用户在屏幕上看到的顺序定位第一个字符串。