Está en la página 1de 6

Eventos

En esta leccin veremos cmo trabajar con los eventos producidos en una aplicacin de Windows, con idea de que nos familiaricemos con ellos, y veamos la relacin que tienen con los delegados; en la siguiente leccin trataremos los delegados con ms profundidad, para seguir con la forma de declararlos en nuestras clases.

Interceptar los eventos de los controles de un formulario


Debido a que an no hemos visto el mdulo dedicado a las aplicaciones de Windows, en las que se utilizan los "clsicos" formularios, no vamos a entrar en detalles sobre cmo crear un formulario ni como aadir controles, etc., todo eso lo veremos en el siguiente mdulo. Para simplificar las cosas, veremos simplemente cmo definir un evento y asociarlo a un control e incluso al propio formulario, esto lo haremos de dos formas: usando el diseador de Windows Forms, ya que esta ser la manera ms habitual de hacerlo, y la otra escribiendo el cdigo directamente, ya que as empezaremos a adentrarnos en este mundo de los eventos y delegados, con idea de que lo que expliquemos a continuacin sea ms fcil de comprender.

Asociar un evento con un control


Cuando trabajamos con el diseador de formularios, tenemos dos formas de asociar un evento con el cdigo. La primera es haciendo doble pulsacin sobre el control en cuestin, de esta forma se crear un mtodo que asociar el evento que est predeterminado para ese control. Por ejemplo, si hacemos doble-click en un botn, el evento predeterminado es el evento Click. Si esa misma accin la realizamos en una caja de textos, el evento predeterminado es TextChanged. Si queremos asociar otros eventos con esos controles, tenemos que recurrir a la ventana de propiedades del diseador de Windows Forms, que tal como podemos comprobar en la figura 2.12, nos muestra, entre otras cosas, un rayo el cual nos servir para poder indicar los diferentes eventos que queramos interceptar en el control que actualmente tengamos seleccionado en el formulario.

Figura 2.12. Ventana de propiedades

En la figura 2.13 podemos ver algunos de los eventos que tenemos disponibles para un control TextBox.

Figura 2.13. Los eventos disponibles de un TextBox

Para crear un evento, simplemente haremos doble-click en el que nos interesa y el diseador de formularios nos mostrar el mtodo en el que podemos escribir nuestro cdigo para cuando se produzca ese evento:
private void textBox1_TextChanged(object sender, EventArgs e)

Pero adems de eso, el diseador de formularios de Visual Studio 2005 tambin ha aadido una lnea de cdigo que es la que realmente hace que se asocie un mtodo con un evento, en el caso del evento TextChanged del control textBox1 que tenemos en el formulario, el cdigo sera el siguiente:
this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);

Como vemos en los dos trozos de cdigo, hay una relacin entre el mtodo que utilizaremos cuando se produzca el evento, el cual utiliza dos parmetros, que es la forma habitual de hacerlo en .NET. El primer parmetro es de tipo object y representa al control que ha producido el evento, el segundo parmetro es de una clase derivada de EventHandler que en algunos casos nos puede proporcionar informacin extra sobre el evento que se ha producido. Para asociar el evento con ese mtodo, en C# se utiliza el operador += seguido de la creacin de un objeto al que se le pasa como argumento el nombre del procedimiento a usar para interceptar el evento. La definicin de la "clase" EventHandler que podemos encontrar en la ayuda de Visual C# 2005, es la siguiente:
public delegate void EventHandler(object sender, EventArgs e);

Como podemos apreciar realmente no es una clase normal, sino que es un "delegado". Y como tambin podemos ver, en ningn sitio se indica que reciba un solo parmetro. Aunque de esto nos ocuparemos ms adelante, por ahora solo debemos saber que en C# los eventos siempre estn ligados a los delegados. Si seguimos buscando en la ayuda de Visual C# 2005, nos encontramos con esta definicin del evento TextChanged:
public event EventHandler TextChanged;

Es decir, el evento TextChanged es del tipo del delegado EventHandler. Para mantener un poco el suspense, dejemos aqu las explicaciones. Por ahora, simplemente debemos saber que para asociar un evento con un mtodo, debemos usar el operador += para asignar el "manejador" de eventos al evento en cuestin, y lo que asignamos es un nuevo objeto basado en un tipo declarado como delegado al que le pasamos el nombre del procedimiento que se usar cuando se produzca el evento.

Asociar varios eventos a un mismo procedimiento


Algunas veces nos encontraremos en la situacin de que estamos utilizando el mismo cdigo para interceptar el mismo tipo de evento en controles diferentes, en esos casos nos puede interesar utilizar un solo mtodo, en el que haremos el trabajo.

Asociarlos usando el diseador de Windows Forms La forma ms fcil de asociar un mismo mtodo con varios controles es hacerlo usando la ventana de propiedades, ver figura 2.13, en esa ventana de propiedades, adems de crear nuevos mtodos donde interceptar los eventos, podemos asociar un evento con un mtodo ya existente. Por ejemplo, si tenemos varios controles del tipo TextBox en los que nos interesa utilizar un solo mtodo para seleccionar todo el texto cuando el control recibe el foco, podramos escribir este cdigo que inicialmente estara asociado con el evento Enter del control textBox1:
private void textBox1_Enter(object sender, EventArgs e) { ((TextBox)sender).SelectAll(); }

Lo que tenemos que hacer es lo siguiente: -Seleccionamos el control al que queremos asociar ese mismo evento. -En la ventana de propiedades, (con la opcin de eventos seleccionada), buscamos el evento Enter, y en lugar de hacer doble pulsacin, (porque si lo hacemos creara un nuevo procedimiento), lo que tenemos que hacer es presionar el combo que es lo que se usa para indicar el mtodo usado, de la lista desplegable que se muestra, (ver figura 2.14), seleccionamos el mtodo que nos interese. En nuestro ejemplo, seleccionaramos textBox1_Enter.

Figura 2.14. Asociar un evento a un mtodo existente

Como podemos apreciar en la figura 2.14, en la lista desplegable se muestran tres mtodos, esto es as porque todos ellos tienen los parmetros adecuados al tipo de evento que hemos seleccionado.

Asociarlos usando cdigo Si en lugar de asociar un mismo mtodo usando el diseador de Windows Forms, queremos hacerlo por cdigo, lo podemos aadir en el constructor del formulario despus de la llamada al mtodo InitializeComponent(). El IDE de Visual C# 2005 nos ayuda a la hora de crear el manejador de eventos, tal como podemos ver en la figura 2.15:

Figura 2.15. Ayuda del IDE de C# para crear manualmente manejadores de eventos

Si presionamos la tecla TAB se aadir automticamente el cdigo necesario para "ligar" ese evento con el mtodo que el IDE de C# "cree" que debe ser, en este caso, sera textBox2_Enter, pero una vez que el IDE ha aadido el cdigo podemos cambiarlo para que apunte al que realmente nos interesa.

En caso de que ese evento ya est asociado con otro mtodo, el IDE nos avisar de ese hecho.