16,554
社区成员
发帖
与我相关
我的任务
分享
Module DiyTreeView
Public TreeView_Check_Changed As Boolean = True
#Region "TreeView CheckBox 联动"
Private Enum NodeState
AllUnSelected = 0 '全不选
AllSelected = 1 '全选
SomeSelected = 2 '部分选定
End Enum
Public Sub checkChanged(ByVal tree As TreeView, ByVal e As MouseEventArgs)
If Not TreeView_Check_Changed Then
TreeView_Check_Changed = True
Exit Sub
End If
Dim n As TreeNode
n = tree.GetNodeAt(e.X, e.Y)
If n Is Nothing Then
Exit Sub
End If
If n.GetNodeCount(False) > 0 And (n.Parent Is Nothing) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllChildNodesState(n, CType(n.StateImageIndex, NodeState))
ElseIf n.GetNodeCount(False) > 0 And (Not (n.Parent Is Nothing)) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllChildNodesState(n, CType(n.StateImageIndex, NodeState))
ChangeAllParentState(n)
ElseIf n.GetNodeCount(False) = 0 And (Not (n.Parent Is Nothing)) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllParentState(n)
ElseIf n.GetNodeCount(False) = 0 And (n.Parent Is Nothing) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
End If
End Sub
' 改变n的所有子节点的状态
Private Sub ChangeAllChildNodesState(ByVal n As TreeNode, ByVal NodeStateDes As NodeState)
Dim myEnumerator As IEnumerator = n.Nodes.GetEnumerator()
While myEnumerator.MoveNext()
CType(myEnumerator.Current, TreeNode).StateImageIndex = NodeStateDes
ChangeAllChildNodesState(CType(myEnumerator.Current, TreeNode), NodeStateDes)
End While
End Sub
'n为当前节点(而要被改变状态的是n的父节点,也就是n.parent)
Private Sub ChangeAllParentState(ByVal n As TreeNode)
Dim blnAllUnSelected, blnAllSelected As Boolean
If n.Parent Is Nothing Then
Exit Sub
End If
Dim myEnumerator As IEnumerator = n.Parent.Nodes.GetEnumerator()
While myEnumerator.MoveNext()
If CType(myEnumerator.Current, TreeNode).StateImageIndex = 2 Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
ElseIf CType(myEnumerator.Current, TreeNode).StateImageIndex = 1 Then
If blnAllUnSelected Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
Else
blnAllSelected = True
End If
ElseIf CType(myEnumerator.Current, TreeNode).StateImageIndex = 0 Then
If blnAllSelected Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
Else
blnAllUnSelected = True
End If
End If
End While
If blnAllSelected And Not blnAllUnSelected Then
n.Parent.StateImageIndex = 1
Call ChangeAllParentState(n.Parent)
Return
End If
If blnAllUnSelected And Not blnAllSelected Then
n.Parent.StateImageIndex = 0
Call ChangeAllParentState(n.Parent)
Return
End If
End Sub
#End Region
End Module
Private Sub mainTreeViewMouseUp(ByVal sender As Object, ByVal e As Windows.Forms.MouseEventArgs) Handles TreeView1.MouseUp
checkChanged(TreeView1, e)
End Sub
Private Sub TreeViewBeforeCollapse(ByVal sender As Object, ByVal e As Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeCollapse, TreeView1.BeforeExpand
TreeView_Check_Changed = False
End Sub