1

我有一个 RadTreeView C# 组件。树是嵌套的,所以一些节点有它们的子树,存储在上层节点的节点属性中。

现在我需要按值查找节点。节点隐藏在子树中的某处。如果我使用电话

  RadTreeNode rtn= PagesTreeView.Nodes.FindNodeByValue(i.ToString());

PagesTreeView 是我的树,然后它只搜索顶级节点。

我如何不仅使用当前树级别的节点,还可以深入到子树中按值查找节点?我需要自己编写这样的递归搜索还是有一个简单的解决方案?

4

3 回答 3

5

递归搜索 RadComboBox

没有用于递归搜索的内置函数,但是您可以非常轻松地滚动自己的功能。这应该对你有用(未经测试):

RadTreeNode FindNodeRecursive(RadTreeNodeCollection nodes, string value)
{
    foreach (RadTreeNode node in nodes)
    {
        if(node.Value == value)
            return node;

        if (node.Nodes.Count > 0)
        {
            FindNodeRecursive(node.Nodes, value);
        }

        return null;
    }
}

然后这样称呼它:

var node = FindNodeRecursive(PagesTreeView.Nodes, i.ToString());
于 2012-11-30T17:44:27.680 回答
1

是的,您需要编写自己的递归函数来进行搜索。如果您使用的是控件的 ASP.NET AJAX 版本,则另一个选项是 GetAllNodes() 方法。它返回树层次结构中的所有节点(我猜它在底层使用递归)。获得整个列表后,您将在其中搜索您关心的节点。这种方法的最大缺点是,如果您有很多节点,搜索可能会很慢并且会消耗大量内存。进行自己的递归搜索是最好的方法。

有关更多信息,请参阅本文

于 2012-11-27T21:31:10.353 回答
1

老问题,但我在我的应用程序中遇到了同样的问题,如何搜索分层树节点。

我想分享一个对先前解决方案提案的更正。当递归调用 FindNodeRecursive() 时,递归调用的返回值永远不会被评估或分配给变量。因此,您总是会经历 foreach 循环并且返回值为 null。

更正和测试的功能代码(WPF C#):

    RadTreeNode FindNodeRecursive(RadTreeNodeCollection nodes, string value)
    {
        RadTreeNode ret = null;
        foreach (RadTreeNode node in nodes)
        {
            if(node.Value == value)
                return node;

            if (node.Nodes.Count > 0)
            {
                ret = FindNodeRecursive(node.Nodes, value);
            }

            return ret;
        }
    }

功能使用:

    var node = FindNodeRecursive(PagesTreeView.Nodes, i.ToString());
    if (node != null) // found 
    { 
        ;
    }
于 2015-09-30T06:28:01.090 回答