Option Explicit
Private Sub Form_Load()
With TreeView1
.Nodes.Add , , "Parent1", "Test1"
.Nodes.Add "Parent1", tvwChild, "Child1", "Test_CH1"
.Nodes.Add "Parent1", tvwChild, "Child2", "Test_CH2"
.Nodes.Add "Parent1", tvwChild, "Child3", "Test_CH3"
.Nodes.Add "Child3", tvwChild, "Child_33", "Test_CH3_CH3"
.Nodes.Add "Parent1", tvwChild, "Child4", "Test_CH4"
.Nodes.Add "Parent1", tvwChild, "Parent2", "Test2"
.Nodes.Add "Parent2", tvwChild, "Child11", "Test_CH1"
.Nodes.Add "Parent2", tvwChild, "Child22", "Test_CH2"
.Nodes.Add "Parent2", tvwChild, "Child33", "Test_CH3"
.Nodes.Add "Parent2", tvwChild, "Child44", "Test_CH4"
.Checkboxes = True
.LineStyle = tvwTreeLines
End With
NodeAllExpanded TreeView1
End Sub
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
Call AllChildSynchro(Node)
Call AllMaterSynchro(Node)
End Sub
'// -选中下级-
Private Sub AllChildSynchro(ByVal NodeChoose As Object)
On Error Resume Next
Dim lNextLoop As Long
Dim ObjChildren As Object
If CBool(NodeChoose.Children > 0) Then
Set ObjChildren = NodeChoose.Child
For lNextLoop = 1 To NodeChoose.Children
ObjChildren.Checked = NodeChoose.Checked
If ObjChildren.Children > 0 Then Call AllChildSynchro(ObjChildren)
Set ObjChildren = ObjChildren.Next
Next lNextLoop
End If
End Sub
'// -取消上级-
Private Sub AllMaterSynchro(ByVal NodeChoose As Object)
On Error Resume Next
If Not NodeChoose.Checked Then If TypeName(NodeChoose.Parent) = "INode" Then NodeChoose.Parent.Checked = False
If Not NodeChoose.Checked Then If TypeName(NodeChoose.Parent) = "INode" Then Call AllMaterSynchro(NodeChoose.Parent)
End Sub
'// -节点张开-
Private Sub NodeAllExpanded(ByVal ObjTvw As Object)
On Error Resume Next
Dim ObjChild As Object
For Each ObjChild In ObjTvw.Nodes
ObjChild.Expanded = IIf(ObjChild.Key = ObjChild.Root.Key, False, True)
ObjChild.Root.Expanded = IIf(ObjChild.Key = ObjTvw.Nodes(ObjTvw.Nodes.Count).Key, True, False)
Next ObjChild
End Sub