CREAR EVENTOS EN CSHARP | C# .NET


 CREAR EVENTOS EN CSHARP | C# .NET


Eventos


En esta lección veremos cómo trabajar con los eventos producidos en una aplicación de Windows, con idea de que nos familiaricemos con ellos, y veamos la relación que tienen con los delegados; en la siguiente lección trataremos los delegados con más profundidad, para seguir con la forma de declararlos en nuestras clases.




Interceptar los eventos de los controles de un formulario


Debido a que aún no hemos visto el módulo dedicado a las aplicaciones de Windows, en las que se utilizan los "clásicos" formularios, no vamos a entrar en detalles sobre cómo crear un formulario ni como añadir controles, etc., todo eso lo veremos en el siguiente módulo. Para simplificar las cosas, veremos simplemente cómo definir un evento y asociarlo a un control e incluso al propio formulario, esto lo haremos de dos formas: usando el diseñador de Windows Forms, ya que esta será la manera más habitual de hacerlo, y la otra escribiendo el código directamente, ya que así empezaremos a adentrarnos en este mundo de los eventos y delegados, con idea de que lo que expliquemos a continuación sea más fácil de comprender.

Asociar un evento con un control


Cuando trabajamos con el diseñador de formularios, tenemos dos formas de asociar un evento con el código.

La primera es haciendo doble pulsación sobre el control en cuestión, de esta forma se creará un método que asociará el evento que esté predeterminado para ese control.

Por ejemplo, si hacemos doble-click en un botón, el evento predeterminado es el evento Click. Si esa misma acción 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 diseñador 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.



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


Para crear un evento, simplemente haremos doble-click en el que nos interesa y el diseñador de formularios nos mostrará el método en el que podemos escribir nuestro código para cuando se produzca ese evento:


private void textBox1_TextChanged(object sender, EventArgs e)
{

}


Pero además de eso, el diseñador de formularios de Visual Studio .NET también ha añadido una línea de código que es la que realmente hace que se asocie un método con un evento, en el caso del evento TextChanged del control textBox1 que tenemos en el formulario, el código sería el siguiente:


this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);


Como vemos en los dos trozos de código, hay una relación entre el método que utilizaremos cuando se produzca el evento, el cual utiliza dos parámetros, que es la forma habitual de hacerlo en .NET. El primer parámetro es de tipo object y representa al control que ha producido el evento, el segundo parámetro es de una clase derivada de EventHandler que en algunos casos nos puede proporcionar información extra sobre el evento que se ha producido.

Para asociar el evento con ese método, en C# se utiliza el operador += seguido de la creación de un objeto al que se le pasa como argumento el nombre del procedimiento a usar para interceptar el evento.

La definición de la "clase" EventHandler que podemos encontrar en la ayuda de Visual C# .NET, 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 también podemos ver, en ningún sitio se indica que reciba un solo parámetro. Aunque de esto nos ocuparemos más adelante, por ahora solo debemos saber que en C# los eventos siempre están ligados a los delegados.
Si seguimos buscando en la ayuda de Visual C# .NET, nos encontramos con esta definición 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 método, debemos usar el operador += para asignar el "manejador" de eventos al evento en cuestión, 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 situación de que estamos utilizando el mismo código para interceptar el mismo tipo de evento en controles diferentes, en esos casos nos puede interesar utilizar un solo método, en el que haremos el trabajo.

Asociarlos usando el diseñador de Windows Forms


La forma más fácil de asociar un mismo método con varios controles es hacerlo usando la ventana de propiedades, ver figura 2.13, en esa ventana de propiedades, además de crear nuevos métodos donde interceptar los eventos, podemos asociar un evento con un método ya existente.
Por ejemplo, si tenemos varios controles del tipo TextBox en los que nos interesa utilizar un solo método para seleccionar todo el texto cuando el control recibe el foco, podríamos escribir este código que inicialmente estaría 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 opción de eventos seleccionada), buscamos el evento Enter, y en lugar de hacer doble pulsación, (porque si lo hacemos crearía un nuevo procedimiento), lo que tenemos que hacer es presionar el combo que es lo que se usa para indicar el método usado, de la lista desplegable que se muestra, (ver figura 2.14), seleccionamos el método que nos interese. En nuestro ejemplo, seleccionaríamos textBox1_Enter.





Como podemos apreciar en la figura 2.14, en la lista desplegable se muestran tres métodos, esto es así porque todos ellos tienen los parámetros adecuados al tipo de evento que hemos seleccionado.


Asociarlos usando código



Si en lugar de asociar un mismo método usando el diseñador de Windows Forms, queremos hacerlo por código, lo podemos añadir en el constructor del formulario después de la llamada al método InitializeComponent().
El IDE de Visual C# .NET 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 añadirá automáticamente el código necesario para "ligar" ese evento con el método que el IDE de C# "cree" que debe ser, en este caso, sería textBox2_Enter, pero una vez que el IDE ha añadido el código podemos cambiarlo para que apunte al que realmente nos interesa.

En caso de que ese evento ya esté asociado con otro método, el IDE nos avisará de ese hecho.


No hay comentarios:

Publicar un comentario

DELEGADOS EN C# .NET | PUNTEROS A METODOS

Delegados Tal como hemos comentado, los eventos y los delegados están muy unidos en C#. De hecho no se pueden definir eventos si no def...