Vous êtes sur la page 1sur 4

Recorrido de todos los controles en un Form C# y VB.

NET
Hace un tiempo trabaj en un proyecto en el cual quera "formatear"
a los controles de un formulario, para poder ofrecer al usuario un
"skin" o un tema a la aplicacin, por ejemplo, que todos los controles
'label' de un formulario se colorearan de color azul, para eso lo tena
que hacer dinmicamente, ya que tena varios formularios en la
misma aplicacin, y algunos cargados de distintos tipos de controles.
El recorrido de controles, se puede hacer de 2 maneras:
1. Recorriendo de manera Iterativa los controles de un control. En
esta forma, slo podemos recorrer los controles hijos de un
control padre, por ejemplo, si tenemos un Form, y queremos
aplicar este recorrido, entonces unicamente se recorrer todos
los controles que estn directamente agregados en el
formulario y no dentro de otro control, es decir, si tenemos 3
controles dentro del Form: 1 Label, 1 GroupBox y 1 Button, pero
el Label se encuentra dentro del Group Box, al hacer este
recorrido, no afectar al Label, sino solo al Button y al
GroupBox.

Suponiendo que tenemos este formulario, en este tipo de recorrido,


cuando queramos recorrer todos los controles que tenemos en el
Form1, solo recorreremos a GroupBox1 y a Button1.
2. Recorriendo de manera Recursiva TODOS los controles de un
control. En esta forma se podrn recorrer todos y cada uno de
los controles que esten dentro de un control padre, an cuando
algunos controles estn dentro de otro y ste a su vez de otro
(esto se conoce como controles anidados), mientras formen
parte del mismo control padre que establecemos, se har dicho
recorrido. sta es la mejor manera de hacerlo, cuando se trate
de recorrer de manera DINMICA, es decir, cuando no se
conoce ni dnde, ni cuntos controles vamos a recorrer. Cuando
conozcamos su ubicacin, o su tamao, y sabemos que NO VA A

CAMBIAR en el transcurso de vida de nuestra aplicacin,


entonces no conviene hacer un recorrido Recursivo de todos,
sino almacenarlos en una coleccin y ah hacer el recorrido,
este tipo de recorrido es sobre una coleccin de elementos, en
la cual conocemos su tamao (esto lo explicar ms adelante).

Cdigo:
1. Recorriendo de manera Iterativa

C#

//Recorremos con un ciclo for each cada control que hay en la coleccion Controls de un
objeto llamado 'control'
foreach(Control contHijo in control.Controls){
//Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el
fondo de todos los controles
contHijo.BackColor = Color.Blue;
}

VB.NET

'Recorremos con un ciclo for each cada control que hay en la coleccion Controls de un
objeto llamado 'control'
For Each contHijo As Control In control.Controls
'Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el
fondo de todos los controles
contHijo.BackColor = Color.Blue
Next

2. Recorriendo de manera Recursiva

C#

public void RecControles(Control control) {


//Recorremos con un ciclo for each cada control que hay en la coleccin Controls
foreach(Control contHijo in control.Controls){
//Preguntamos si el control tiene uno o mas controles dentro del mismo con la propiedad
'HasChildren'
//Si el control tiene 1 o ms controles, entonces llamamos al procedimiento de forma
recursiva, para que siga recorriendo los dems controles
if (contHijo.HasChildren) this.RecControles(contHijo);
//Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el
fondo de todos los controles
contHijo.BackColor = Color.Blue;

}
}

VB.NET

Public Sub RecControles(ByVal control As Control)


'Recorremos con un ciclo for each cada control que hay en la coleccin Controls
For Each contHijo As Control In control.Controls
'Preguntamos si el control tiene uno o mas controles dentro de l mismo con la propiedad
'HasChildren'
'Si el control tiene 1 o ms controles, entonces llamamos al procedimiento de forma
recursiva, para que siga
'recorriendo los dems controles
If contHijo.HasChildren Then Me.RecControles(contHijo)
'Aqui va la lgica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el
fondo de todos los controles
contHijo.BackColor = Color.Blue
Next
End Sub
Como se dan cuenta, en el recorrido de forma recursiva, se debe hacer uso de un
procedimiento que haga el recorrido (de ah su nombre, una funcin [o procedimiento]
que se llama a s misma, mientras que de manera iterativa lo puedes utilizar en tu cdigo
de funcin o procedimiento sin necesidad de declarar otra funcin alterna.
Ahora bien, esto lo hace de maravilla, y est bien hacerlo cuando NO conozcamos el
tamao ni la ubicacin de los controles, ya que como ven, el recorrido pasa por TODOS
los controles de un cierto control, pero... y qu pasa si slo necesito los controles
'Button' que se encuentran en un formulario que, de antemano, s que no voy a agregar
otros controles, pues entonces lo que conviene es que realices una coleccin de esos
botones y hagas el recorrido UNICAMENTE en esos controles. La coleccin la puedes
hacer en un Array, en un objeto Collection, etc.

Vous aimerez peut-être aussi