2017-04-27 5 views
0

ツリービュー内のすべてのルートフォルダのインデックスを見つけるにはどうすればよいですか? 4つのルートノードを持つツリービューがあるとします。 (表示されていない)彼らは同じレベルですべてだし、それらのすべては、子ノードを持つ:ツリービューでルートフォルダのインデックスを検索するにはどうすればよいですか?

|-a 
|-b 
|-c 
|-d 

は、今度は、「C」ルートノードのブランチ上の選択されたノードがありますと仮定してみましょう。どのようにして "c"ノードのインデックスを取得できますか? (この場合、ルートノード間の3番目のノードです)。

したがって、選択したノードを指定すると、ルートノードのインデックスはどのように取得できますか?

+0

リサイズ:

(コメント付き)、サンプルコードを見てみましょうか? wpf? asp.net mvc? – Backs

+0

WinForms。問題は、ツリービューにルートフォルダのリストを設定し、そのサブフォルダを子ノードとして追加したことです。しかし、その名前だけがツリービューに保存されます。 選択したノードから完全なパスを再構築する必要があります。したがって、完全なパスを作成するには、選択したノードのフルパスに正しいルートフォルダを追加する必要があります。そのため、各ルートノードのインデックスを知って、リストのそれぞれのルートフォルダとペアにする必要があります。 – Caladan

+0

これまでに行ったことのコードを共有してください。 –

答えて

1

あなたの仕事を達成するには、クリックされたノードの親と親の親などを見つけるべきです。ここで再帰が必要です。

private void Form1_Load(object sender, EventArgs e) 
{ 
    //add test data on form load (you can do it on form design, too. 
    //there are 4 root nodes and each of them has one subnode. 
    //Additionally, c's first node, called 'c-1', has it's own child. 
    treeView1.Nodes.Add(new TreeNode("a")); 
    treeView1.Nodes.Add(new TreeNode("b")); 
    treeView1.Nodes.Add(new TreeNode("c")); 
    treeView1.Nodes.Add(new TreeNode("d")); 
    treeView1.Nodes[0].Nodes.Add(new TreeNode("a-1")); 
    treeView1.Nodes[1].Nodes.Add(new TreeNode("b-1")); 
    treeView1.Nodes[2].Nodes.Add(new TreeNode("c-1")); 
    treeView1.Nodes[3].Nodes.Add(new TreeNode("d-1")); 
    treeView1.Nodes[2].Nodes[0].Nodes.Add(new TreeNode("c-1-1")); 

    //expand those nodes to see things clearly 
    treeView1.ExpandAll(); 

    //subscribe to after select event. When user selects one node, treeView1_AfterSelect method will be called. 
    //this can be done on form designer too, on properties panel 
    treeView1.AfterSelect += treeView1_AfterSelect; 

} 

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    //this method will be called when you select node 
    //find topmost parent by calling method FindTopMostParent and passing it selected node 
    var topmostParent = FindTopMostParent(e.Node); 

    //here's your index of topmost node (parent or grandparent or grand-grand of selcted node(
    var index = treeView1.Nodes.IndexOf(topmostParent); 

} 

private TreeNode FindTopMostParent(TreeNode node) 
{ 
    //first, we check if passed node has parent. If not, return that node, because it's the topmost one 
    //then, repeat that search for parent again and again until you find that node which does not have parent 
    while (node.Parent != null) 
     return FindTopMostParent(node.Parent); 

    //return parentless node :) 
    return node; 
} 
+0

ありがとう、これは私が望んだものです。 – Caladan

関連する問題