Looping through nodes in a tree

I have a VB6 program with a tree in a form. I already have the tree all populated. What I want to do know is build in the logic that if all of the children of a parent are checked then the parent itself will be checked, or true. If someone could please point me in the right direction with a sample of code, that would be great. Thanks, arajoe.
arajoeAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
jmundsackConnect With a Mentor Commented:
Drop a treeview on a form and paste in this code:

Option Explicit

Private Sub Form_Load()
    Dim nod As Node
    With TreeView1
        Set nod = .Nodes.Add(, tvwFirst, "fruit", "Fruit")
        nod.Expanded = True
        .Nodes.Add "fruit", tvwChild, "apple", "Apple"
        .Nodes.Add "fruit", tvwChild, "banana", "Banana"
        .Nodes.Add "fruit", tvwChild, "orange", "Orange"
        Set nod = .Nodes.Add(, tvwFirst, "veg", "Vegetable")
        nod.Expanded = True
        .Nodes.Add "veg", tvwChild, "asparagus", "Asparagus"
        .Nodes.Add "veg", tvwChild, "cucumber", "Cucumber"
        .Nodes.Add "veg", tvwChild, "zucchini", "Zucchini"
    End With
End Sub

Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
    Dim nod As Node
    Dim blnAll As Boolean
    If Node.Children > 0 Then
        Set nod = Node.Child
        Do While Not nod Is Nothing
            nod.Checked = Node.Checked
            Set nod = nod.Next
        Loop
    End If
    If Not Node.Parent Is Nothing Then
        blnAll = True
        Set nod = Node.Parent.Child
        Do While Not nod Is Nothing
            If Not nod.Checked Then
                blnAll = False
                Exit Do
            End If
            Set nod = nod.Next
        Loop
        Node.Parent.Checked = blnAll
    End If
End Sub

0
 
Guy Hengel [angelIII / a3]Connect With a Mentor Billing EngineerCommented:
this recursive sub would set the same checked value for all the children by the parent's checked value.

public Sub CheckChildren ( byval n as node )
  dim c as Node

  set c = n.Child
  while not ( c is nothing )
    c.checked = n.checked
    checkchildren c

    set c = c.nextsibling
  wend


end sub
0
 
Mike TomlinsonConnect With a Mentor Middle School Assistant TeacherCommented:
0
 
ArkConnect With a Mentor Commented:
Another approach can be used if you have no duplicate nodes in each level in treeview:

Private Sub Form_Load()
   Dim nd As Object, ndParent As Object
   Dim i As Long, j As Long, k As Long
   For i = 1 To 5
      Set ndParent = TreeView1.Nodes.Add(, , , "Node Level 1 #" & i)
      For j = 1 To 5
          Set nd = TreeView1.Nodes.Add(ndParent, tvwChild, , "Node Level 2 #" & j)
          For k = 1 To 5
              Call TreeView1.Nodes.Add(nd, tvwChild, , "Node Level 3 #" & j)
          Next k
      Next j
   Next i
End Sub

Private Sub TreeView1_NodeCheck(ByVal Node As Node)
   Dim sPath As String, length As Long
   sPath = Node.FullPath
   length = Len(sPath)
   For Each nd In TreeView1.Nodes
       If Len(nd.FullPath) >= length Then
          If Left(nd.FullPath, length) = sPath Then
             nd.Checked = Node.Checked
          End If
       End If
   Next
End Sub
0
 
arajoeAuthor Commented:
Thanks to everyone. I went with the answer I did because it allowed for a more recursive function. The code I ended up with is below. Thanks again, arajoe.


Private Sub Check_Parents(ByRef Node As MSComctlLib.Node, ByVal Node_Checked_Value As Boolean)

    Dim Child As MSComctlLib.Node
    Dim All_Checked As Boolean
   
    If Node.Children > 0 Then
        Set Child = Node.Child
        Do While Not Child Is Nothing
       
            Child.Checked = Node_Checked_Value
           
            UnAssign_SUP Child
           
            Check_Parents Child, Child.Checked
           
            Set Child = Child.Next
           
        Loop
    End If
   
    If Not Node.Parent Is Nothing Then
        All_Checked = True
        Set Child = Node.Parent.Child
        Do While Not Child Is Nothing
            If Not Child.Checked Then
                All_Checked = False
                Exit Do
            End If
            Set Child = Child.Next
        Loop
        Node.Parent.Checked = All_Checked
    End If
   
End Sub
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.