3层树视图节点复选框 [英] 3 layers Treeview Nodes Checkboxes
问题描述
我有一个 3 层树视图,正在使用下面的代码.我让它做以下事情,
I have a 3 layer treeview and is using the code below. I am getting it to do the following,
1) 如果选中 parent,则检查所有子节点.
1) If parent is checked, check all child nodes.
2) 如果只有一个子节点未选中,则取消选中父节点.
2) If just one child node is unchecked, uncheck parent node.
3) 如果所有子节点都被选中,则检查父节点.
3) If all child nodes are checked, check parent node.
以下代码仅适用于 2 层.如果你能指导我如何制作它,我将不胜感激.有很多关于树视图的信息,但其中大部分似乎无关紧要 =/如果您能向我展示有关树视图控制的良好指南,那就太好了.谢谢!
Code below only works for 2 layers. Would appreciate if you can guide me how to make it three. There are much information on treeview but most of them seems irrelevant =/ Will be great if you can show me a good guide on treeview control. Thank you!
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck
RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
For Each node As TreeNode In e.Node.Nodes
node.Checked = e.Node.Checked
Next
If e.Node.Checked Then
If e.Node.Parent Is Nothing = False Then
Dim allChecked As Boolean = True
For Each node As TreeNode In e.Node.Parent.Nodes
If Not node.Checked Then
allChecked = False
End If
Next
If allChecked Then
e.Node.Parent.Checked = True
End If
End If
Else
If e.Node.Parent Is Nothing = False Then
e.Node.Parent.Checked = False
End If
End If
AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
End Sub
推荐答案
使用递归的工作示例:
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
For i As Integer = 1 To 3
Dim node As New TreeNode("Parent #" & i.ToString)
node.Nodes.Add("Child #1")
node.Nodes.Add("Child #2")
Dim childNode As New TreeNode("Child #3")
childNode.Nodes.Add("Grand Child #1")
childNode.Nodes.Add("Grand Child #2")
Dim grandNode As New TreeNode("Grand Child #3")
grandNode.Nodes.Add("Great Grand Child #1")
grandNode.Nodes.Add("Great Grand Child #2")
childNode.Nodes.Add(grandNode)
node.Nodes.Add(childNode)
grandNode.Expand()
childNode.Expand()
node.Expand()
TreeView1.Nodes.Add(node)
Next
End Sub
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterCheck
RemoveHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
Call CheckAllChildNodes(e.Node)
If e.Node.Checked Then
If e.Node.Parent Is Nothing = False Then
Dim allChecked As Boolean = True
Call IsEveryChildChecked(e.Node.Parent, allChecked)
If allChecked Then
e.Node.Parent.Checked = True
Call ShouldParentsBeChecked(e.Node.Parent)
End If
End If
Else
Dim parentNode As TreeNode = e.Node.Parent
While parentNode Is Nothing = False
parentNode.Checked = False
parentNode = parentNode.Parent
End While
End If
AddHandler TreeView1.AfterCheck, AddressOf TreeView1_AfterCheck
End Sub
Private Sub CheckAllChildNodes(ByVal parentNode As TreeNode)
For Each childNode As TreeNode In parentNode.Nodes
childNode.Checked = parentNode.Checked
CheckAllChildNodes(childNode)
Next
End Sub
Private Sub IsEveryChildChecked(ByVal parentNode As TreeNode, ByRef checkValue As Boolean)
For Each node As TreeNode In parentNode.Nodes
Call IsEveryChildChecked(node, checkValue)
If Not node.Checked Then
checkValue = False
End If
Next
End Sub
Private Sub ShouldParentsBeChecked(ByVal startNode As TreeNode)
If startNode.Parent Is Nothing = False Then
Dim allChecked As Boolean = True
Call IsEveryChildChecked(startNode.Parent, allChecked)
If allChecked Then
startNode.Parent.Checked = True
Call ShouldParentsBeChecked(startNode.Parent)
End If
End If
End Sub
End Class
这篇关于3层树视图节点复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!