Buscar un control en una aplicación Windows

Fecha: 24/Feb/2005 (Febrero 23 de 2005)
Autor: Miguel Muñoz Serafín, [email protected]

 


Este artículo surge como respuesta a la pregunta que algunas personas me han hecho respecto a como buscar un control en una aplicación Windows. Cabe mencionar que en aplicaciones Web contamos con el método FindControl que permite obtener un control web conociendo su nombre. En una aplicación windows no existe este método, lo que más se acerca a esto es accediendo a la colección de controles (controls) pero no podemos obtener el control por su nombre, solo por su índice.

Lo primero que debemos saber es que los controles contenidos en una Windows Form podemos encontrarlos en su colección Controls. Recorriendo cada uno de los controles en la Windows Form podemos ir comparando el nombre del control hasta encontrarlo. Debemos tener en cuenta que dentro de la colección de controles podemos encontrar otros controles que funcionan como contenedores de otros controles, por ejemplo un Panel que puede tener a su vez otros controles por lo cual debemos hacer una búsqueda recursiva en estos controles. Es importante también mencionar que el nombre de los controles en la búsqueda es sensible a mayúsculas y minúsculas.

Los elementos importantes que utilizaremos en este código serán:

a) La colección Controls. Cada control contenedor, Windows Form, Panel, etc. cuentan con una colección de controles donde estan almacenados los controles que contienen.

b) La propiedad HasChildren del control. esta propiedad nos indica sí el control tiene controles hijos (HasChildren = True) o no (HasChildren = False). Con esto sabremos sí es necesario realizar la búsqueda sobre el control en cuestión de forma recursiva.

A continuación les presento el código en Visual Basic de la función BuscaControl:

Function BuscaControl(ByVal Nombre As String, ByVal Contenedor As Control) As Control
        Dim c As Control = Nothing
        'Recorremos la colección de Controles del Contenedor
        For Each ctrl As Control In Contenedor.Controls
            'Comparamos el nombre del control con el nombre que buscamos
        'Hace la comparación en mayusculas.
            If UCase(ctrl.Name) = UCase(Nombre) Then
                'Ha sido encontrado. Asignamos el control encontrado y salimos del for
                c = ctrl
                Exit For
            End If
            'El control actual es un contenedor?
            If ctrl.HasChildren Then
                'HasChildren = True. Es contenedor
                'Buscar recursivamente en este control
                c = BuscaControl(Nombre, ctrl)
                If Not (c Is Nothing) Then 'Se ha encontrado el control?
                    'Ha sido encontrado. Asignamos el control encontrado y salimos del for
                    c = ctrl
                    Exit For
                End If
            End If
        Next
        'c tiene el control encontrado o bien tiene Nothing
        Return c
    End Function

Un ejemplo de como utilizar esta función sería la siguiente:

Dim c As Control
c = BuscaControl("TextBox1", Me) 
If c Is Nothing Then
   MessageBox.Show("El control no existe")
Else
   MessageBox.Show(c.Text)
End If

Espero esta función pueda serles útil. Cualquier corrección, crítica o comentarios pueden enviarlos a mi correo electrónico.


ir al índice