none
Recorrer Controles dentro de otro controles RRS feed

  • Pregunta

  • Buenas, no se si se pueda, pero lo que me gustaría hacer es hacer una búsqueda entre todos los controles que estén en un formulario sin importar que éste, se encuentre dentro de un GroupBox o cualquier otro contenedor de controles. EJ: con este código busco cualquier control, pero especificando el contenedor. así:

    For each Controles in Me.GroupBox.Controls

    Next

    Pero el que quiero seria mas o menos así:

    For Each AllControles in Me.TodosLosControles

    'Si el control que busco está, dentro  directamente en el formulario y fuera dentro de un GroupBox 

    'Que aun así me encuentre el control. No se si sea posible. Gracias!

    Next

    miércoles, 10 de mayo de 2017 17:39

Respuestas

  • Si es posible, de hecho podrías implementar una función recursiva para buscar los controles dentro de un contenedor y como algo adicional podrías utilizar Generics para especificar -en la llamada- el tipo de control que deseas buscar, por ejemplo:

    - La función

    Public Function ObtenerControles(Of T As Control)(ByVal contenedor As Control) As List(Of T)
    	Dim controles As New List(Of T)()
    	For Each control As Control In contenedor.Controls
    		If TypeOf control Is T Then
    			controles.Add(DirectCast(control, T))
    		End If
    
    		controles.AddRange(ObtenerControles(Of T)(control))
    	Next
    
    	Return controles
    End Function

    - Por ejemplo, pintar el fondo de color rojo a todos los controles del formulario

    For Each item As Control In ObtenerControles(Of Control)(Me)
    	item.BackColor = Color.Red
    Next

    - Pintar el fondo de color amarillo a todos los objetos de tipo TextBox

    For Each item As Control In ObtenerControles(Of TextBox)(Me)
    	item.BackColor = Color.Yellow
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 jueves, 11 de mayo de 2017 9:14
    miércoles, 10 de mayo de 2017 18:09
  • Entiendo que la clase BindingNavigator no es un contenedor, sino que se trata de un medio de enlace entre un origen y controles adyacentes a través de "x" propiedad, en ese contexto la función proporcionada no automatiza dicha funcionalidad, tendrás que adecuarla a lo que requieres. Quizá puedas filtrar la colección por el origen a través de alguna propiedad, algo como:

    For Each item As Control In ObtenerControles(Of Control)(Me).
                    Where(Function(c) c.Propiedad = "Origen")

     
    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 jueves, 11 de mayo de 2017 9:15
    miércoles, 10 de mayo de 2017 22:46

Todas las respuestas

  • Si es posible, de hecho podrías implementar una función recursiva para buscar los controles dentro de un contenedor y como algo adicional podrías utilizar Generics para especificar -en la llamada- el tipo de control que deseas buscar, por ejemplo:

    - La función

    Public Function ObtenerControles(Of T As Control)(ByVal contenedor As Control) As List(Of T)
    	Dim controles As New List(Of T)()
    	For Each control As Control In contenedor.Controls
    		If TypeOf control Is T Then
    			controles.Add(DirectCast(control, T))
    		End If
    
    		controles.AddRange(ObtenerControles(Of T)(control))
    	Next
    
    	Return controles
    End Function

    - Por ejemplo, pintar el fondo de color rojo a todos los controles del formulario

    For Each item As Control In ObtenerControles(Of Control)(Me)
    	item.BackColor = Color.Red
    Next

    - Pintar el fondo de color amarillo a todos los objetos de tipo TextBox

    For Each item As Control In ObtenerControles(Of TextBox)(Me)
    	item.BackColor = Color.Yellow
    Next


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 jueves, 11 de mayo de 2017 9:14
    miércoles, 10 de mayo de 2017 18:09
  • Ok una cosa mas, también me interesan items específicos de un BindinNavigator, también puedo obtenerlos con este método?
    miércoles, 10 de mayo de 2017 18:58
  • Osea, que en esa misma funcion determine si hay objetos de tipo BindinNavigator y en caso de que si los haya

    que recorra dicho BindinNavigator y me continue dicha busqueda EJ:

    if TypeOF (Control) is  BindinNavigator then

    For each item in Control.items

    'Acción

    Next

    End if


    • Editado Renzo20 miércoles, 10 de mayo de 2017 19:10
    miércoles, 10 de mayo de 2017 19:09
  • Entiendo que la clase BindingNavigator no es un contenedor, sino que se trata de un medio de enlace entre un origen y controles adyacentes a través de "x" propiedad, en ese contexto la función proporcionada no automatiza dicha funcionalidad, tendrás que adecuarla a lo que requieres. Quizá puedas filtrar la colección por el origen a través de alguna propiedad, algo como:

    For Each item As Control In ObtenerControles(Of Control)(Me).
                    Where(Function(c) c.Propiedad = "Origen")

     
    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo20 jueves, 11 de mayo de 2017 9:15
    miércoles, 10 de mayo de 2017 22:46
  • Muchas Gracias!
    jueves, 11 de mayo de 2017 9:17