Search code examples
c#treeviewtreenode

How to check if all subnodes of TreeNode are expanded?


Is there any easy way to check expand the state of TreeNode and its children?

bool IsAllNodesExpanded(TreeNode nodeToCheck)
{
  // Use nodeToCheck.isExpanded
  // Use something to check all childrens
  // return something
}

Solution

  • As your question is specific to a particular WinForm component, but the solution I'm going to write you is more general. Therefore I'll explain my solution to you considering a general tree, but the code I'll provide you solves your own problem.

    What you want to do is basically a tree traversal, which is the process of traversing all the children of a tree given it's root. Basically we need to check whether all the descendants (not the children) of a node. The difference between children and descendant is that children share the same parent (for instance A B C are children of X if and only if A B and C are directly connected to X), whereas descendants might be "children of children of children...of children (example: A is a descendant of X if, starting from X, there is a path on the tree that, starting from the node X, goes down to the node A).

    In order to visit all the descendants of a tree we need a recursive function. In our case the function returns a boolean that tells us whether all the descendants of a particular starting node are expanded. There is a sample code that does exactly what you've asked for:

    bool areAllNodesExpanded(TreeNode nodeToCheck){
    
        if(!nodeToCheck.IsExpanded)
            return false;
        foreach(TreeNode n in nodeToCheck.Nodes){
            if (n.Nodes.Count == 0)
                continue;
            if(!areAllNodesExpanded(n))
                return false;
        }
        return true;
    }
    

    Hope this helps.

    LuxGiammi

    EDIT: the code snippet above could not be compiled because of two errors I made: 1. it's IsExpanded and not isExpanded 2. For some reasons I do not want to investigate further, var n is of type object whereas it should be of type TreeNode. Mistake corrected