none
Recorrer Grupo de Controles RRS feed

  • Pregunta

  • Hola comunidad nuevamente solicitando su ayuda, tengo un winform el cual contiene un tabcontrol -> tabpage -> groupbox ->luego los respectivos textbox, bueno lo que quiero es cambiar el color de fondo de los textbox cuando tiene el foco y cuando pierde el foco, el siguiente codigo me funciona muy cuando solo tengo un groupbox y luego los textbox pero cuando hay un tercer contenedor ya no funciona. A continuación muestro el codigo que utilizo en el evento load del winform.

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            '' cambio  color foco dentro de un grupo de controles                 ''
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            Dim ctrl, ctrl1, ctrl2, ctrl3 As Control

            For Each ctrl In Me.Controls
                'realizo el cambio del color dentro del panel1
                If (TypeOf (ctrl) Is System.Windows.Forms.TabControl) Then
                    For Each ctrl1 In ctrl.Controls
                        If (TypeOf (ctrl1) Is System.Windows.Forms.TabPage) Then
                            For Each ctrl2 In ctrl1.Controls
                                If (TypeOf (ctrl2) Is System.Windows.Forms.GroupBox) Then
                                    For Each ctrl3 In ctrl2.Controls
                                        If (TypeOf (ctrl3) Is System.Windows.Forms.TextBox) Then
                                            Dim miTextBox As TextBox = DirectCast(ctrl3, TextBox)
                                            AddHandler miTextBox.Enter, AddressOf TieneFoco
                                            AddHandler miTextBox.Leave, AddressOf PierdeFoco
                                        End If
                                    Next
                                End If
                            Next
                        End If
                    Next
                End If
            Next
        End Sub
        Private Sub TieneFoco(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim miTextBox As TextBox = DirectCast(sender, TextBox)
            miTextBox.BackColor = Color.PaleGoldenrod
        End Sub
        Private Sub PierdeFoco(ByVal serder As System.Object, ByVal e As System.EventArgs)
            Dim miTextBox As TextBox = DirectCast(serder, TextBox)
            miTextBox.BackColor = Color.White
        End Sub

    Agradeceria su ayuda.


    DJINVACION


    • Editado DJINVACION viernes, 9 de mayo de 2014 4:08 correcion del codigo
    viernes, 9 de mayo de 2014 4:07

Respuestas

  • Haz una rutina recursiva para buscar los textboxes a cualquier nivel:

    Sub ConectarEventos(Control c)
        If TypeOf(c) is TextBox Then
            Dim t as TextBox = DirectCast(c, TextBox)
            AddHandler t.Enter, AddressOf TieneFoco
            AddHandler t.Leave, AddressOf PierdeFoco
        Else
            For Each (c1 as Control In c.Controls)
                ConectarEventos(c1)
            Next
        End If
    End Sub

    Y después, inicialízalo llamando a esa rutina pasándole como argumento el contenedor raíz (que puede ser Me si quieres examinar todo el formulario).
    viernes, 9 de mayo de 2014 5:27

Todas las respuestas

  • Haz una rutina recursiva para buscar los textboxes a cualquier nivel:

    Sub ConectarEventos(Control c)
        If TypeOf(c) is TextBox Then
            Dim t as TextBox = DirectCast(c, TextBox)
            AddHandler t.Enter, AddressOf TieneFoco
            AddHandler t.Leave, AddressOf PierdeFoco
        Else
            For Each (c1 as Control In c.Controls)
                ConectarEventos(c1)
            Next
        End If
    End Sub

    Y después, inicialízalo llamando a esa rutina pasándole como argumento el contenedor raíz (que puede ser Me si quieres examinar todo el formulario).
    viernes, 9 de mayo de 2014 5:27
  • Hola.

    En vez de buscar todos los textbox cada vez que se gana/pierde el foco, puedes hacerlo una sola vez. Construye una lista con los textboxes, en el constructor de la form o cuando esta se muestra, y posteriormente solo tiene que recorrer esa lista (con expresiones linq es inmediato) y cambiar el color de fondo de todos los txtboxes (que sean diferentes al actual).

    Espero te sirva de ayuda.

    Un saludo.

    viernes, 9 de mayo de 2014 7:08
  • Gracias Enrique me funciono a la primera, Hilo resuelto.

    DJINVACION

    viernes, 6 de junio de 2014 4:00