2010-03-02 10 views
18

Sé que en C#, hay varios eventos incorporados que pasan un parámetro ("Cancelar") que si se establece en true detendrá la ejecución posterior en el objeto que generó el evento .Cómo implementar un evento de cancelación en C#

¿Cómo implementar un evento en el que el objeto recaudación fue capaz de mantener un registro de una propiedad en las EventArgs?

Aquí está un ejemplo de WinForms de lo que estoy tratando de hacer:
http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.cancel.aspx

Gracias.

Respuesta

15

Es realmente fácil.

private event _myEvent; 

// ... 

// Create the event args 
CancelEventArgs args = new CancelEventArgs(); 

// Fire the event 
_myEvent.DynamicInvoke(new object[] { this, args }); 

// Check the result when the event handler returns 
if (args.Cancel) 
{ 
    // ... 
}
+1

Bastante obvio. Ha sido uno de esos días. Muchas gracias. – Sako73

+1

@ sako73: De nada. Todos tenemos esos días. ;) –

+0

@JonSeigel ¿Entiendo bien que si hay dos controladores registrados y el primero establece 'args.Cancel' a * verdad * y la segunda establece' args.Cancel' a * * falsa, entonces el resultado es ' args.Cancel == false'? – thersch

2

Fácil:

  1. crear una instancia de CancelEventArgs (o el tipo personalizado).
  2. Levante el evento, pasando esa instancia.
  3. Compruebe la propiedad Canceld en [1].

¿Necesita ejemplos de código?

0

usted tiene que esperar la llamada que provoca el evento y después comprobar la bandera en sus EventArgs (en particular CancelEventArgs).

3

Lo que necesitaba era una manera de detener a los suscriptores de recibir el evento después de un abonado de la canceló. En mi situación, no quiero que el evento se propague a otros suscriptores después de que un suscriptor lo haya cancelado. He implementado esto usando el control de eventos personalizado:

public class Program 
{ 
    private static List<EventHandler<CancelEventArgs>> SubscribersList = new List<EventHandler<CancelEventArgs>>(); 

    public static event EventHandler<CancelEventArgs> TheEvent 
    { 
     add { 
      if (!SubscribersList.Contains(value)) 
      { 
       SubscribersList.Add(value); 
      } 
     } 
     remove 
     { 
      if (SubscribersList.Contains(value)) 
      { 
       SubscribersList.Remove(value); 
      } 
     } 
    } 

    public static void RaiseTheEvent(object sender, CancelEventArgs cancelArgs) 
    { 
     foreach (EventHandler<CancelEventArgs> sub in SubscribersList) 
     { 
      sub(sender, cancelArgs); 

      // Stop the Execution after a subscriber cancels the event 
      if (cancelArgs.Cancel) 
      { 
       break; 
      } 
     } 
    } 


    static void Main(string[] args) 
    { 
     new Subscriber1(); 
     new Subscriber2(); 

     Console.WriteLine("Program: Raising the event"); 

     CancelEventArgs cancelArgs = new CancelEventArgs(); 
     RaiseTheEvent(null, cancelArgs); 
     if (cancelArgs.Cancel) 
     { 
      Console.WriteLine("Program: The Event was Canceled"); 
     } 
     else 
     { 
      Console.WriteLine("Program: The Event was NOT Canceled"); 
     } 
     Console.ReadLine(); 
    } 
} 

public class Subscriber1 
{ 
    public Subscriber1() 
    { 
     Program.TheEvent += new EventHandler<CancelEventArgs>(program_TheEvent); 
    } 

    void program_TheEvent(object sender, CancelEventArgs e) 
    { 
     Console.WriteLine("Subscriber1: in program_TheEvent"); 
     Console.WriteLine("Subscriber1: Canceling the event"); 
     e.Cancel = true; 
    } 
} 

public class Subscriber2 
{ 
    public Subscriber2() 
    { 
     Program.TheEvent += new EventHandler<CancelEventArgs>(program_TheEvent); 
    } 

    void program_TheEvent(object sender, CancelEventArgs e) 
    { 
     Console.WriteLine("Subscriber2: in program_TheEvent"); 

    } 
} 
11

Esta es la forma que evite llamar a otros abonados una vez que uno de ellos afirma cancelar:

var tmp = AutoBalanceTriggered; 
if (tmp != null) 
{ 
    var args = new CancelEventArgs(); 
    foreach (EventHandler<CancelEventArgs> t in tmp.GetInvocationList()) 
    { 
     t(this, args); 
     if (args.Cancel) // a client cancelled the operation 
     { 
      break; 
     } 
    } 
} 
+0

Otra demostración más de la lógica de votación SO. – Behrooz

Cuestiones relacionadas