为 Treeview 和 TreeNode 传递通用参数

我有以下两种方法,它们循环一个 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。这是一种深度优先搜索,按照用户在屏幕上看到的顺序定位第一个字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值