none
Quitar el check a todos los nodos padres cuando se quita el check de un nodo hijo RRS feed

  • Pregunta

  • Hola a todos.

    Tengo el siguiente código que me permite checkear o quitar el check a todos los todos del TreeView o hacerlo solo con los nodos hijos de un solo nodo padre.

    El código tambien permite quitar el check al nodo padre cuando le quito el check a uno o varios de sus hijos, o checkearlo cuando selecciono todos sus hijos.

    Pero lo que quiero lograr es que tambien se checkeen o no, los nodos que son padres de ese nodo padre.

    Es decir:

    -Nodo Raíz

    ----Nodo Padre 1

    -------Nodo Padre 2

    ----------Nodos Hijos (Padre 2)

    Cuando checkee o quite uno o varios nodos hijos que tambien se checkee o no el nodo padre 2 (en este mi código lo hace), el nodo padre 1 y el nodo Raíz

    Les agradezco de antemano la ayuda, les dejo el código.

        Private Sub TVprueba_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TVprueba.AfterCheck
            Dim iSeleccionados As Integer

            If bSelecDesdeNodoHijo Then Return

            TVprueba.BeginUpdate()

            If e.Node.Nodes.Count <> 0 Then
                MarcarDesmarcarSubNodos(e.Node.Nodes, e.Node.Checked)
            End If

            If e.Node.Parent IsNot Nothing Then
                iSeleccionados = e.Node.Parent.Nodes.OfType(Of TreeNode).Count(Function(pre) pre.Checked)
                bSelecDesdeNodoHijo = True
                e.Node.Parent.Checked = (iSeleccionados = e.Node.Parent.Nodes.Count)
                bSelecDesdeNodoHijo = False
            End If

            TVprueba.EndUpdate()

        End Sub

        Private Sub MarcarDesmarcarSubNodos(ByVal colCollection As TreeNodeCollection, ByVal bEstado As Boolean)

            For Each sNode As TreeNode In colCollection
                sNode.Checked = bEstado
                If sNode.Nodes.Count > 0 Then
                    MarcarDesmarcarSubNodos(sNode.Nodes, bEstado)
                End If
            Next

        End Sub



    • Editado Jav_ch miércoles, 19 de julio de 2017 19:55 palabras de mas
    miércoles, 19 de julio de 2017 19:54

Respuestas

  • Puedes hacer una llamada a esta función que recorre los nodos padre de un nodo :

        Private Sub MarcarDesmarcarNodosPadre(ByVal Nodo As TreeNode, ByVal bEstado As Boolean)

            While (Nodo.Parent IsNot Nothing)
                bSelecDesdeNodoHijo = True
                Nodo = Nodo.Parent
                Nodo.Checked = bEstado
                bSelecDesdeNodoHijo = False
            End While

        End Sub

    La llamada la harías en el AfterCheck:

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

            If bSelecDesdeNodoHijo Then Return

            TreeView1.BeginUpdate()

            If e.Node.Nodes.Count <> 0 Then
                MarcarDesmarcarSubNodos(e.Node.Nodes, e.Node.Checked)
            End If

            MarcarDesmarcarNodosPadre(e.Node, e.Node.Checked)

            TreeView1.EndUpdate()
        End Sub


    Saludos, Javier J

    jueves, 20 de julio de 2017 7:25