2009-06-09 4 views
1

Nehmen wir an, ich habe eine Veranstaltung. Nennen wir es DoStuff. Bevor DoStuff passiert, versuche ich ein anderes Ereignis, PreviewDoStuff, zu verwenden, um zu überprüfen, ob ich verhindern muss, dass DoStuff angerufen wird. Das Problem, mit dem ich konfrontiert bin, ist, dass ich keinen Wert von PreviewDoStuff zurückbekomme, wie zum Beispiel einen Return-Code oder irgendetwas aufgrund der Art und Weise, wie Ereignisse geschrieben werden. Und Ereignisargumente werden nicht an den Aufrufer zurückgegeben. Daher kann ich die Eigenschaft "behandelte" Ereignisargumente nicht abrufen. Ich bin mir sicher, dass es einen Weg dafür geben muss, aber ich bin mir nicht sicher wie. Irgendwelche Ideen?Wie schreibe ich ein "Preview" -Typ Event, das ein Main Event abbrechen kann?

Danke!

Antwort

5

Erklären Sie das Ereignis als EventHandler<CancelEventArgs>. Dann kann der Listener Cancel auf true setzen, und Sie können diesen Wert verwenden, um zu bestimmen, ob das "echte" Ereignis ausgelöst werden soll oder nicht.

Pflichtcodebeispiel:

public event EventHandler<CancelEventArgs> PreviewDoStuff; 
public event EventHandler DoStuff; 

private void RaiseDoStuff() 
{ 
    CancelEventArgs args = new CancelEventArgs(); 
    OnPreviewDoStuff(args); 
    if (!args.Cancel) 
    { 
     OnDoStuff(EventArgs.Empty); 
    } 
} 

protected void OnPreviewDoStuff(CancelEventArgs e) 
{ 
    EventHandler<CancelEventArgs> previewDoStuff = PreviewDoStuff; 
    if (previewDoStuff != null) 
    { 
     previewDoStuff(this, e); 
    } 
} 

protected void OnDoStuff(EventArgs e) 
{ 
    EventHandler doStuff = DoStuff; 
    if (doStuff != null) 
    { 
     doStuff(this, e); 
    } 
} 

Ein Beispiel für diese im realen Einsatz, überprüfen Sie die FormClosing Ereignis, das eine FormClosingEventArgs-Klasse verwendet, die wiederum von CancelEventArgs erbt.

0

Lassen Sie Ihr PreviewDoStuff ein internes Flag setzen, das DoStuff prüft, wenn es ausgelöst wird. Noch besser, lassen Sie den Code, der DoStuff auslöst, das Flag überprüfen, bevor es das Ereignis auslöst.

0

Ich nehme an, Sie meinen, Sie möchten Ihre eigene Veranstaltung namens DoStuff erstellen. Ich denke, es ist möglich „ref“ Argumente zu übergeben:

public delegate void PreviewDoStuffFunc(ref bool Handled); 
public event PreviewDoStuffFunc PreviewDoStuff; 

Aber der normale Weg wäre so etwas wie CancelEventArgs zu verwenden:

public event CancelEventArgs PreviewDoStuff; 
public event EventArgs DoStuff; 

Dann, nachdem Sie die Vorschau-Ereignis ausgelöst, überprüfen Sie die Cancel:

var e = new CancelEventArgs();  
if (PreviewDoStuff != null) 
    PreviewDoStuff(this, e); 
if (!e.Cancel) 
    DoStuff(this, EventArgs.Empty); 
Verwandte Themen