1

RadTreeView C#コンポーネントがあります。ツリーはネストされているため、一部のノードにはサブツリーがあり、上位レベルのノードのNodesプロパティに格納されています。

次に、値でノードを見つける必要があります。ノードはサブツリーのどこかに隠されています。電話を使う場合

  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.NETAJAXバージョンを使用している場合のもう1つのオプションは、GetAllNodes()メソッドです。ツリー階層内のすべてのノードを返します(内部で再帰を使用していると思います)。リスト全体を取得したら、関心のあるノードを検索します。このアプローチの大きな欠点は、ノードが多数ある場合、検索が遅くなり、大量のメモリを消費する可能性があることです。独自の再帰検索を行うことが最善のアプローチです。

詳細については、この記事を参照してください。

于 2012-11-27T21:31:10.353 に答える
1

古い質問ですが、アプリケーションでこれと同じ問題に直面しました。階層ツリーノードを検索する方法です。

以前のソリューション提案に対する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 に答える