2009-06-09 15 views
1

Disons que j'ai un événement. Appelons-le DoStuff. Avant que DoStuff n'arrive, j'essaye d'utiliser un autre événement, PreviewDoStuff, pour vérifier si je dois empêcher DoStuff d'être appelé. Le problème auquel je suis confronté est que je ne peux récupérer aucune valeur de PreviewDoStuff, comme un code de retour ou quoi que ce soit dû à la façon dont les événements sont écrits. Et les arguments d'événement ne sont pas renvoyés à l'appelant, donc je ne peux pas obtenir la propriété "traitée" des arguments de l'événement. Je suis sûr qu'il doit y avoir un moyen de le faire, mais je ne sais pas comment. Des idées?Comment écrire un événement de type "Preview" qui peut annuler un événement principal?

Merci!

Répondre

5

Déclarez l'événement en tant que EventHandler<CancelEventArgs>. Ensuite, l'écouteur peut définir Cancel sur true et vous pouvez utiliser cette valeur pour déterminer si vous souhaitez augmenter l'événement "real" ou non.

Code obligatoire exemple:

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

Pour un exemple dans l'utilisation de la vie réelle, vérifier l'événement FormClosing, qui utilise une classe FormClosingEventArgs, qui hérite à son tour de CancelEventArgs.

0

Demandez à votre PreviewDoStuff de définir un drapeau interne que DoStuff vérifie quand il se déclenche. Encore mieux, avoir le code qui soulève DoStuff vérifier le drapeau avant qu'il soulève l'événement.

0

Je suppose que vous voulez dire que vous voulez créer votre propre événement appelé DoStuff. Je pense qu'il est possible de passer des arguments « ref »:

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

Mais la manière standard serait d'utiliser quelque chose comme CancelEventArgs:

public event CancelEventArgs PreviewDoStuff; 
public event EventArgs DoStuff; 

Puis après avoir le feu l'avant-première, vous vérifiez le Annuler:

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