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