计算包含和不包含后续子节点的节点

时间:2018-01-22 18:44:10

标签: c# treeview

我试图用(A)计算树节点的数量,而没有后续的子节点(B)。例如,下面的图像应返回2/1。

img

我尝试使用TreeView方法,但无法弄清楚如何使用更深层次的节点。

private void tvResources_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    int a=0,b=0;          
    foreach (TreeNode node in e.Node.Nodes)               
    {              
        if (e.Node.Nodes.Contains(node))
            a += 1;
        else
            b += 1;
    }           
    e.Node.Text += @" - " + a+"/"+b;
}

这可以通过一些递归函数来完成,但有没有更简单的解决方案?

1 个答案:

答案 0 :(得分:1)

如果您只需要当前节点(扩展前),您可以使用foreach循环来检查每个直接子节点的节点数,这将直接为您提供答案。

private void tvResources_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
    CalculateAB( e.Node );
}

private void CalculateAB( TreeNode node )
{
    int a = 0;
    int b = 0;
    foreach ( TreeNode child in node.Nodes )
    {
        if ( child.Nodes.Count() > 0 )
        {
            a++;
        } 
        else
        {
            b++;
        }
    }
    node.Text += @" - " + a + "/" + b;
}

如果要一次计算整个TreeView的值,则可以使用递归。您可以使用深度优先搜索并使用a/b方法计算遇到的所有节点的CalculateAB值。

private void CalculateForTree( TreeNode root )
{
    foreach ( var child in root.Nodes )
    {
        CalculateForTree( child );
    }
    CalcualteAB( root );    
}