2017-04-27 55 views
0

如何查找树视图中每个根文件夹的索引? 假设有一个包含4个根节点的树形视图。他们都在同一水平上,他们都具有子节点(不显示):如何查找树视图中根文件夹的索引?

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

现在让我们假设有一个在“C”根节点的分支选择的节点。我怎么能得到“C”节点的索引? (在这种情况下,它是根节点之间的第三个节点)。

因此,给定一个选定的节点,我怎么能得到它的根节点的索引?

+0

的WinForms? WPF? asp.net mvc? – Backs

+0

WinForms。问题是我填充了根目录文件夹列表树视图,然后他们的子文件夹被添加为子节点。但只有他们的名字存储在treeview中。 我必须重建从选定节点的完整路径。所以,我必须将正确的根文件夹添加到选定节点的完整路径以创建完整路径。这就是为什么我必须知道每个根节点的索引,才能将它们与列表中的相应根文件夹配对。 – 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