troubleshooting Question

C# - Winforms - TreeView - Multiple Nodes

Avatar of CipherIS
CipherISFlag for United States of America asked on
C#.NET Programming
4 Comments1 Solution217 ViewsLast Modified:
Apparently my question has been neglected so I am opening up a new question as I need a solution.

I have the Below code.  It works fine for a TreeView with two nodes.  I have three nodes that I am working on and need to  expand it.  So, it my data looks something like this.

-  Level 1
   -  Sub Level  2
      -  Sub Sub Level 3

When I  click on  Sub Sub Level 3 I  want all nodes  above check if all nodes above "Sub Sub Level 3 are checked" and unchecked  also (the reverse).  Right now it will check "Sub Sub Level 3" and "Sub Level 2" but not  "level 1".  I also want all Nodes below Level 1 checked if Level 1 is checked.

        private void myTreeView_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (trvCheckLock)
            {
                return;
            }
            trvCheckLock = true;
            trvMessageType.BeginUpdate();
            try
            {
                TreeNode item = e.Node;
                //If the user checks/unchecks the node that has children,
                if (item.Nodes.Count > 0)
                {
                    //All children are unchecked as well
                    foreach (TreeNode child in item.Nodes)
                    {
                        child.Checked = item.Checked;
                        UpdateObjectModel(item.Text, child.Text, child.Checked);
                    }
                }
                //Otherwise (if the item has a parent)
                if (item.Parent != null)
                {
                    //The parent node should be checked only when all its children 
                    //are checked too
                    if (!item.Checked)
                    {
                        item.Parent.Checked = false;
                    }
                    else
                    {
                        bool allChecked = true;
                        foreach (TreeNode sibling in item.Parent.Nodes)
                        {
                            if (!(allChecked = allChecked && sibling.Checked))
                            {
                                break;
                            }
                        }
                        item.Parent.Checked = allChecked;
                    }
                }
                //Update the list of the selected items to the right
                if (item.Parent != null)
                    UpdateSelected(item);
            }
            finally
            {
                trvMessageType.EndUpdate();
                trvCheckLock = false;
            }
        }
ASKER CERTIFIED SOLUTION
Join our community to see this answer!
Unlock 1 Answer and 4 Comments.
Start Free Trial
Learn from the best

Network and collaborate with thousands of CTOs, CISOs, and IT Pros rooting for you and your success.

Andrew Hancock - VMware vExpert
See if this solution works for you by signing up for a 7 day free trial.
Unlock 1 Answer and 4 Comments.
Try for 7 days

”The time we save is the biggest benefit of E-E to our team. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange.

-Mike Kapnisakis, Warner Bros