2017-12-16 107 views
0

選択したノードの正確なインデックス番号を取得します。TreeViewで選択したノードのインデックスを取得する

以下のコードを使用していますが、正確なインデックスは表示されません。

treeView1.SelectedNode.Index 


a 
b 
    c 
d 
    e 
    f--> If i click on 'f' i want to get '6' value 

ツリービューで選択したノードのインデックスを取得するにはどうすればよいですか?

+0

階層のインデックスとは何ですか? –

+0

@AdrianoRepettiさんはあなたの質問をしませんでした。 –

+0

treeView1.SelectedNode.Indexはあなたとあなたが見たいものを表示しますか? –

答えて

1

お分かりのように、TreeViewコントロールはTreeNodeの階層的なコレクションで、各TreeNodeには子TreeNodeのリストがある場合があります。 TreeNodeのIndexプロパティは、兄弟TreeNodeのコレクション内のインデックス(ゼロベース)です。したがって、上の例では、TreeNode 'f'を選択すると、そのレベルの最初のTreeNodeであるため、インデックス値0が返されます。

a 0 
b 0 
    c 0 
d 1 <-- because 'd' is the second node at this level. 'b' is index 0 
    e 0 
    f 0 

今、あなたの質問に答えるために、あなたはrecursionに依存する必要があります。私は、インデックスを、対応する各ノードとあなたの例のツリーを描画した場合、あなたはこのような何かを見るでしょう。この概念に精通していない場合は、recursionを参照してください。すべてのことを脇に冗談は、単にそれ自身を呼び出す関数を意味します。なぜこの質問に答えるために再帰が必要なのでしょうか?現在選択されているノードの上にツリー内にいくつの要素があるかわからないので、ツリー階層を上に移動するときにカウントする必要があります。

再帰関数を書く際の最初のレッスン:終了する方法を教えてください。無限ループとは異なり、再帰は永遠に続かないか、スタックオーバーフローの例外が発生します(このサイトと混同しないでください)。

再帰関数についてもう一つ注意しなければならないのは、わかりやすく簡単なことです。

だから、何を望んでいることは、このようなものである:、ない5、しかし、インデックスは0から始まり、最も近代的な言語で、今、私はあなたはそれが6を返したいと言っ知っ

a 0 
b 1 
    c 2 
d 3 
    e 4 
    f 5 

ない1 。

OKなので、私たちはこのようなものがあります木這い上がっ簡単な再帰関数で始まる場合:

private int GetIndex(TreeNode node) 
{ 
    // Always make a way to exit the recursion. 
    if (node.Parent == null) 
     return node.Index; 

    return node.Index + GetIndex(node.Parent); 
} 

今、上記のコードはツリーを再帰的になりますが、それは私たちに正しい答えを与えることはありません。どうして?私たちが評価しているTreeNodeがインデックス内の兄弟ノード(例ではノード 'b'からノード 'd')の上位にある場合、子ノードはありません。そして、子ノードは子ノードを持つことができるので(onとon ...)、私たちは別の再帰関数を持っています。

再帰ラウンド2:

private int GetIndex(TreeNode node) 
{ 
    int returnValue = 0; 

    // Always make a way to exit the recursion. 
    if (node.Index == 0 && node.Parent == null) 
     return returnValue; 

    // Now, count every node. 
    returnValue = 1; 

    // If I have siblings higher in the index, then count them and their decendants. 
    if (node.Index > 0) 
    { 
     TreeNode previousSibling = node.PrevNode; 
     while (previousSibling != null) 
     { 
      returnValue += GetDecendantCount(previousSibling); 
      previousSibling = previousSibling.PrevNode; 
     } 
    } 

    if (node.Parent == null) 
     return returnValue; 
    else 
     return returnValue + GetIndex(node.Parent); 
} 

public int GetDecendantCount(TreeNode node) 
{ 
    int returnValue = 0; 

    // If the node is not the root node, then we want to count it. 
    if (node.Index != 0 || node.Parent != null) 
     returnValue = 1; 

    // Always make a way to exit a recursive function. 
    if (node.Nodes.Count == 0) 
     return returnValue; 

    foreach (TreeNode childNode in node.Nodes) 
    { 
     returnValue += GetDecendantCount(childNode); 
    } 
    return returnValue; 
} 

そして、それはあなたが求めているものを行う必要があります。

+0

うまく説明! –

関連する問題