在TreeView上获取选定的节点索引

时间:2017-12-16 07:40:55

标签: c# winforms

我想获得所选节点的确切索引号。

我使用下面的代码,但它没有显示确切的索引。

treeView1.SelectedNode.Index


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

如何在treeview上获取所选节点的索引?

1 个答案:

答案 0 :(得分:1)

如您所知,TreeView控件是TreeNodes的分层集合,其中每个TreeNode可能具有子TreeNode列表。 TreeNode的Index属性是兄弟TreeNodes集合中的(基于零)索引。因此,在上面的示例中,TreeNode“f”(如果选中)将返回Index值0,因为它是该级别的第一个TreeNode。如果我用每个节点对应的索引绘制你的示例树,你会看到类似这样的东西:

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。除了开玩笑,它只是意味着一个自称的功能。为什么我们需要递归才能回答这个问题?因为我们不知道当前所选节点上方树中有多少元素,所以我们需要在向上移动树层次结构时进行计数。

编写递归函数的第一课:让它退出。与无限循环不同,递归不能永远继续,否则您将获得堆栈溢出异常(不要与此站点混淆)。

关于递归函数需要注意的第二件事是它会非常简单。

所以你想要的是这样的:

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

现在,我知道你说你希望它返回6而不是5,但在大多数现代语言中,索引从0开始,而不是1。

好的,所以如果我们从一个简单的递归函数开始爬行树,我们会有这样的东西:

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;
}

那应该按照你的要求行事。