2009-10-08 22 views
11

¿Cómo se puede utilizar el evento System.ComponentModel.CancelEventArgs? Supongamos que tenemos el siguiente código:¿Cómo se pueden usar eventos como CancelEventArgs?

public event CancelEventHandler EventTest = delegate { }; 

    public void MakeSomethingThatRaisesEvent() 
    { 
     CancelEventArgs cea = new CancelEventArgs(); 
     EventTest(this, cea); 
     if (cea.Cancel) 
     { 
      // Do something 
     } 
     else 
     { 
      // Do something else 
     } 
    } 

¿Qué ocurre si hay más de un delegado registrado en el evento? ¿Hay alguna forma de obtener los resultados de todos los suscriptores?

Esto se usa en Winforms (al menos) a veces. Si no es posible obtener todos los valores, ¿solo suponen un suscriptor del evento?

Respuesta

7

preguntar a cada abonado de forma separada, es necesario acceder a la lista:

foreach (CancelEventHandler subHandler in handler.GetInvocationList()) 
{ 
    // treat individually 
} 

entonces usted puede comprobar cada uno de ellos; de lo contrario, acaba de obtener el voto final.

+0

¡Esto! Gracias – FerranB

+0

No es un voto. (Me doy cuenta de que fue un giro de la frase, pero podría malinterpretarse). Si algún suscriptor establece Cancelar en verdadero, entonces es verdadero al final. Ningún suscriptor debe establecer Cancelar en falso porque eso anularía a un suscriptor anterior. –

6

Normalmente, en la mayoría de los casos, la clase solo permite múltiples suscriptores, pero cada uno obtiene la misma instancia de CancelEventArgs.

Si alguno de los suscriptores establece Cancelar en verdadero, la operación se tratará como cancelada.

Puede solucionar esto obteniendo la lista de invocación y enviando un evento a cada suscriptor, pero esto no suele ser necesario.

+3

Es muy fácil que los suscriptores usen el código como e.Cancel = (condición), entonces no se puede suponer que todos vayan a respetar esto. – FerranB

Cuestiones relacionadas