3 слоя Treeview Nodes Флажки - PullRequest
       9

3 слоя Treeview Nodes Флажки

2 голосов
/ 05 сентября 2011

У меня есть трехслойное древовидное представление, и я использую код ниже. Я получаю это, чтобы сделать следующее,

1) Если родитель проверен, проверьте все дочерние узлы.

2) Если не проверен только один дочерний узел, снимите флажок с родительского узла.

3) Если проверены все дочерние узлы, проверьте родительский узел.

Код ниже работает только для 2 слоев. Был бы признателен, если вы можете помочь мне, как сделать это три. Существует много информации о древовидном представлении, но большинство из них кажется неактуальным = / Будет здорово, если вы покажете мне хорошее руководство по управлению древовидным отображением Спасибо!

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

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

Рабочий пример с использованием рекурсии:

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
1 голос
/ 19 сентября 2014

Проверьте следующий тихий простой код.Хотя он и не соответствует одному из ваших требований, но он легкий и удовлетворенный.VB.NET 2010.

    Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck

    Dim childNodeCK As TreeNode = e.Node
    Dim NodeChecked As Boolean = e.Node.Checked

    For Each ChildNode As TreeNode In childNodeCK.Nodes
        If NodeChecked = True Then
            ChildNode.Checked = NodeChecked
        End If
    Next

    If childNodeCK.Checked = False Then
        If e.Node.Parent Is Nothing = False Then
            e.Node.Parent.Checked = False
        End If
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...