C# - Eventos

Descripción general

Forma de declarar y escuchar un evento en C# usando delegados

[TOC] Tabla de Contenidos


↑↑↑

C# - Eventos


↑↑↑

Parte UNO Declaración y disparo del evento


↑↑↑

Primero) Declarar el Evento Personalizado (si existe)

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;
    }
}

↑↑↑

Segundo) Declarar el delegado

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

↑↑↑

Con un evento personalizado

#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


↑↑↑

Tercero) Disparar el evento

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);

↑↑↑

Parte DOS Escuchar el evento

El evento se escucha en una clase por lo que la clase que va a escuchar el evento tiene que dar los siguientes pasos


↑↑↑

Primero) Declarar la clase que dispara el evento

// El Objeto que disparara el evento
private Primos BuscaPrimos;

↑↑↑

Segundo) Instanciar la clase que dispara el evento

// Instanciar el Objeto que disparara el evento
BuscaPrimos = new Primos();

↑↑↑

Tercero) Asignar el evento a la función que se debe ejecutar

/* 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);
 
}

↑↑↑

Cuarto) Escribir la función que se ejecutara cuando se "escuche" el evento.

// 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);
}

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Bloque de apuntes tácticos de C#]
[Documento Start]
[Imprimir el Documento]