3层树视图节点复选框 [英] 3 layers Treeview Nodes Checkboxes

查看:21
本文介绍了3层树视图节点复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆