none
Control In Controls no funciona con los controles que esta dentro de GroupPanel RRS feed

  • Pregunta

  • No me funciona con un control que esta dentro de un GroupPanel

    For Each ctrl As Control In Controls
                If TypeOf ctrl Is PictureBox Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                ElseIf TypeOf ctrl Is GroupPanel Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                End If
            Next

    sábado, 8 de julio de 2017 7:49

Respuestas

  • No, efectivamente no funciona. La colección Controls no es "recursiva", es decir solo te entrega un nivel de controles. Si necesitas descender al contenido de dichos controles, tienes que volver a recorrer la colección Controls de cada uno de los contenedores. Y si dentro de uno de ellos volviera a haber otro contenedor, como por ejemplo un Panel anidado dentro del GroupBox, volverías a tener que hacer un foreach sobre la colección Controls del Panel.

    Típicamente, ese descenso se hace mediante una subrutina recursiva, que se vaya llamando a sí misma por cada control que encuentra.

    Sub ConectarTodo(Control inicio)
        For Each ctrl As Control In inicio.Controls
                If TypeOf ctrl Is PictureBox Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                ElseIf TypeOf ctrl Is GroupPanel Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                End If
                ConectarTodo(ctrl)
         Next
    End Sub
    
    'Al principio llámalo con ConectarTodo(Me)

    • Propuesto como respuesta Willams Morales sábado, 8 de julio de 2017 16:00
    • Marcado como respuesta JETET domingo, 9 de julio de 2017 11:29
    sábado, 8 de julio de 2017 9:55

Todas las respuestas

  • No, efectivamente no funciona. La colección Controls no es "recursiva", es decir solo te entrega un nivel de controles. Si necesitas descender al contenido de dichos controles, tienes que volver a recorrer la colección Controls de cada uno de los contenedores. Y si dentro de uno de ellos volviera a haber otro contenedor, como por ejemplo un Panel anidado dentro del GroupBox, volverías a tener que hacer un foreach sobre la colección Controls del Panel.

    Típicamente, ese descenso se hace mediante una subrutina recursiva, que se vaya llamando a sí misma por cada control que encuentra.

    Sub ConectarTodo(Control inicio)
        For Each ctrl As Control In inicio.Controls
                If TypeOf ctrl Is PictureBox Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                ElseIf TypeOf ctrl Is GroupPanel Then
                    AddHandler (ctrl.MouseHover), AddressOf MouseHover_All
                End If
                ConectarTodo(ctrl)
         Next
    End Sub
    
    'Al principio llámalo con ConectarTodo(Me)

    • Propuesto como respuesta Willams Morales sábado, 8 de julio de 2017 16:00
    • Marcado como respuesta JETET domingo, 9 de julio de 2017 11:29
    sábado, 8 de julio de 2017 9:55
  • Muchisimas grcias Alberto
    domingo, 9 de julio de 2017 11:29