2010-03-02 10 views
18

Ich weiß, dass in C# mehrere eingebaute Ereignisse einen Parameter übergeben ("Cancel"), die bei true die weitere Ausführung in dem Objekt stoppen, das das Ereignis ausgelöst hat .Wie implementiert man ein Cancel Event in C#

Wie würden Sie ein Ereignis implementieren, bei dem das aufrufende Objekt eine Eigenschaft in den EventArgs verfolgen konnte? Hier

ist ein WinForms Beispiel dafür, was ich zu tun versucht:
http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.cancel.aspx

Danke.

Antwort

15

Es ist wirklich einfach.

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

ziemlich offensichtlich. Es war einer dieser Tage. Vielen Dank. – Sako73

+1

@ sako73: Gern geschehen. Wir alle haben diese Tage. ;) –

+0

@JonSeigel Ich verstehe es richtig, wenn zwei Handler registriert sind und der erste 'args.Cancel' auf * true * setzt und der zweite'args.Cancel' auf * false * setzt, dann lautet das Ergebnis ' args.Cancel == false'? – thersch

2

Ganz einfach:

  1. eine Instanz CancelEventArgs erstellen (oder Ihre benutzerdefinierten Typ).
  2. Heben Sie das Ereignis auf und übergeben Sie diese Instanz.
  3. Überprüfen Sie die Eigenschaft Stornieren auf [1].

Benötigen Sie Codebeispiele?

0

Sie haben, um den Anruf zu warten, das das Ereignis auslösen und überprüfen Sie dann die Flagge in Ihrem EventArgs (insbesondere CancelEventArgs).

3

Was ich brauchte, war eine Möglichkeit, die Abonnenten den Empfang des Ereignisses zu stoppen, nachdem ein Teilnehmer es abgebrochen hat. In meiner Situation möchte ich nicht, dass sich das Ereignis weiter zu den anderen Teilnehmern ausbreitet, nachdem irgendein Teilnehmer es abgebrochen hat. Ich habe diese mit benutzerdefinierten Event-Handling implementiert:

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

Dies ist die Art und Weise, dass ich weitere Teilnehmer anrufen vermeiden, wenn einer von ihnen behauptet Abbrechen:

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

Noch eine Demonstration der SO-Voting-Logik. – Behrooz

Verwandte Themen