我想获得所选节点的确切索引号。
我使用下面的代码,但它没有显示确切的索引。
treeView1.SelectedNode.Index
a
b
c
d
e
f--> If i click on 'f' i want to get '6' value
如何在treeview上获取所选节点的索引?
答案 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;
}
那应该按照你的要求行事。