Forma de declarar y escuchar un evento en C# usando delegados
La clase debe heredar (obligatoriamente) de [EventArgs] y terminar (según las normas de Microsoft) con la palabra [EventArgs]
// evento personalizado class PrimoEncontradoEventArgs : EventArgs { public int numeroPrimo { get; set; } public PrimoEncontradoEventArgs(int primo) { this.numeroPrimo = primo; } }
Observa que:
#region "Patrón de implementación del evento estándar [NombreCambiado]" // A) Declarar el delegado de un evento normal public delegate void NombreCambiadoEvenHandler(object sender, EventArgs e); // B) Declarar el evento public event NombreCambiadoEvenHandler NombreCambiado; // C) Función OnEvento para disparar el evento protected virtual void OnNombreCambiado() { if (NombreCambiado != null) { NombreCambiado(this, new EventArgs()); } } // D) Funciones para Suscribirse / Borrarse de la notificacion del evento public void EventoNombreCambiadoSuscribirse(NombreCambiadoEvenHandler metodoQueSeAñade) { NombreCambiado += metodoQueSeAñade; } public void EventoNombreCambiadoQuitarSuscripcion(NombreCambiadoEvenHandler metodoQueSequita) { NombreCambiado -= metodoQueSequita; } #endregion
#region "Patrón de implementación del evento Personalizado [PrimoEncontrado] " // A) Declarar el delegado de un evento personalizado public delegate void PrimoEncontradoEventHandler(object sender, PrimoEncontradoEventArgs e); // B) Declarar el evento public event PrimoEncontradoEventHandler PrimoEncontrado; // C) Función OnEvento para disparar el evento protected virtual void OnPrimoEncontrado(int primo) { if (PrimoEncontrado != null) { PrimoEncontrado(this, new PrimoEncontradoEventArgs(primo)); } } // D) Funciones para Suscribirse / Borrarse de la notificacion del evento public void EventoPrimoEncontradoSuscribirse(PrimoEncontradoEventHandler metodoQueSeAñade) { PrimoEncontrado += metodoQueSeAñade; } public void EventoPrimoEncontradoQuitarSuscripcion( PrimoEncontradoEventHandler metodoQueSequita) { PrimoEncontrado -= metodoQueSequita; } #endregion
Cuando se crea un componente general del que se pueden derivar clases, se pueden producir supuestos problemas con los eventos. Como los eventos sólo se pueden invocar desde dentro de la clase que los declaró, las clases derivadas no pueden invocar directamente eventos declarados dentro de la clase base. Aunque, a veces, esto es lo deseado, a menudo resulta apropiado dar a la clase derivada la libertad de invocar el evento. Esto se realiza normalmente creando un método de invocación protegido para el evento. Mediante la llamada a este método invocatorio, las clases derivadas pueden invocar el evento. Para obtener más flexibilidad, el método que invoca se suele declarar como virtual, lo cual permite a la clase derivada reemplazarlo. Esto permite a la clase derivada interceptar los eventos que la clase base está invocando, y, posiblemente, realizar su propio procesamiento sobre ellos.
En el ejemplo anterior, esto se ha realizado con un método del tipo [OnChanged], concretamente [OnNombreCambiado] y [OnPrimoEncontrado]. Una clase derivada podría invocar o reemplazar este método si fuera necesario
Se hace en cualquier parte de una función de la clase y todas las veces que sea necesario
// ----------------------------------- // Disparar el evento // ----------------------------------- // Llamando directamente al evento NombreCambiado(this, new EventArgs()); PrimoEncontrado(this, new PrimoEncontradoEventArgs(i)); // Llamando a las funciones utilizando OnEvento OnNombreCambiado(); OnPrimoEncontrado(i);
El evento se escucha en una clase por lo que la clase que va a escuchar el evento tiene que dar los siguientes pasos
// El Objeto que disparara el evento private Primos BuscaPrimos;
// Instanciar el Objeto que disparara el evento BuscaPrimos = new Primos();
/* Constructor estandard */ public ClienteDePrimos() { // Instanciar el Objeto que disparara el evento BuscaPrimos = new Primos(); // Asignamos el evento a la función que se // tiene que ejecutar cuando se dispare el evento // Suscribirse al evento usando las funciones de suscripción BuscaPrimos.EventoNombreCambiadoSuscribirse(BuscaPrimos_NombreCambiado); BuscaPrimos.EventoPrimoEncontradoSuscribirse(BuscaPrimos_PrimoEncontrado); // // Forma alternativa, suscribirse directamente al evento //BuscaPrimos.NombreCambiado += // new Primos.NombreCambiadoEvenHandler(BuscaPrimos_NombreCambiado); //BuscaPrimos.PrimoEncontrado += // new Primos.PrimoEncontradoEventHandler(BuscaPrimos_PrimoEncontrado); }
// La función que se ejecuta cuando se dispara el evento void BuscaPrimos_NombreCambiado(object sender, EventArgs e) { System.Windows.MessageBox.Show("Ha cambiado el nombre"); } // La función que se ejecuta cuando se dispara el evento void BuscaPrimos_PrimoEncontradoTres( object sender, PrimoEncontradoEventArgs e) { System.Windows.MessageBox.Show( " encontrado el primo " + e.numeroPrimo); }