Para una aplicación necesité tener siete CheckBoxes en un formulario indicando los días de la semana. También tengo un array de variables booleanas llamado "dias" cuyos índices (0,1,2,3,4,5,6) representan los días de la semana (L,M,M,J,V,S,D) respectivamente (en C# los índices de los arrays empiezan siempre desde cero). Si selecciono el CkeckBox de los días lunes y miércoles solamente, las variables dias[0] y dias[2] toman el valor de true, el resto de variables "dias" serán false (en la práctica necesitaba el array "dias" para pasárselo a otra clase y luego usarlo para modificar unos campos en una BD...)
Esta vez, en lugar de crear cada CheckBox con el diseñador del Visual Studio quise crearlos como elementos de un array de CheckBoxes. Para este tutorial también voy a crear un array de TextBoxes y otro de Buttons.
La declaración para crear los arrays es como sigue:
Mirando cómo el diseñador del Visual Studio declara y asigna las propiedades a los controles, hice lo mismo para mis arrays de controles, pero dentro de un bucle. Aquí muestro la función que crea los CheckBoxes:
Dentro del bucle asigno los delegados para los eventos respectivos de cada control. Para saber cuál control del array es el que lanza el evento debo examinar el objeto "sender" que es el control quien "envía" o lanza el evento. Para saber el índice del control dentro del array lo almaceno en una propiedad del control: puede ser el nombre, el TabIndex, o el Tag. En realidad puede ser cualquier propiedad cuyo valor no vamos a modificar a lo largo de la aplicación, ya que desde la cual vamos a saber el índice del control dentro del array.
Un dato interesante acerca de los eventos es que estos no se ejecutan al declararlos dentro del bucle que crea los controles. Aquí sólo declaramos el evento y lo asignamos a su respectivo control, el evento recién se ejecuta cuando el control lo "lanza" (es decir: cuando se ejecuta la acción que llama al evento. Esto me ha recordado un poco a la "Evaluación Perezosa" de la programación funcional, no sé si será exactamente lo mismo, pero se le parece mucho).
Las dos líneas con el comentario "poned un breakpoint acá" hacen exactamente lo mismo: Si deseo leer el índice guardado en el nombre del control que lanza el evento, utilizo la variable "n", o más directamente puedo leer el índice usando la propiedad "Tag". Ambas líneas de código cambian el valor del elemento con índice "n" ó índice "Tag" (ambos tienen el mismo valor) del array "dias" a verdadero ó falso, según sea el valor de la propiedad "Checked" del CheckBox con índice "n" ó "Tag" dentro del array de ChackBoxes.
Y esta es la función de los TextBoxes:
En el caso de los TextBoxes, mandarán un saludo al texto de su formulario (el cual se llama "Form1") al recibir el cursor (el índice del respectivo TextBox se lee desde la propiedad "Tag"):
Si se pone un punto de quiebre en las líneas donde dice "poned un breakpoint acá" se podrá ver cómo la ejecución del programa "salta" a la declaración del evento para cambiar los valores a los elementos del array "dias" cuando se pone o quita el "check" de los CheckBoxes.
¿Y qué sucede si deseo enviar mensajes a otros formularios? Debo crear un delegado y su respectivo evento:
También debo crear el otro formulario que va a recibir los mensajes. Lo he llamado Form2, sólo posee un label llamado "label1" y éste es su código:
Ahora voy a crear un array de botones en Form1 con los que le mandaré mensajes a Form2:
Debo tener cuidado de evaluar que mi evento "Enviar" no sea nulo o lanzará una excepción. Esto ocurre si Form2 no se ha cargado. Luego añado un botón desde la barra de herramientas del Visual Studio con el que abriré Form2:
El código del nuevo botón (llamado btnForm2) es::
Si ejecuto la aplicación, y abro también Form2, se verá cómo recibe los mensajes desde los botones creados en el array:
Esta aplicación está compilada con Visual Studio Express 2008 y se puede descargar de aquí.