# 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.
###### Who is Participating?

x

Commented:
Drop a treeview on a form and paste in this code:

Option Explicit

Dim nod As Node
With TreeView1
Set nod = .Nodes.Add(, tvwFirst, "fruit", "Fruit")
nod.Expanded = True
Set nod = .Nodes.Add(, tvwFirst, "veg", "Vegetable")
nod.Expanded = True
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

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

Middle School Assistant TeacherCommented:
0

Commented:
Another approach can be used if you have no duplicate nodes in each level in treeview:

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

Author 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.