2010-10-06 8 views
0

J'essaye de changer une valeur dans les arguments d'événement. Je ne sais pas si cela est possible, mais cela est mon événement en cours dans la classe parente:Comment renvoyer une valeur pour un événement (valeur bulle supérieure)?

public void MasterClass() 
{ 
    void btnSubmit_Click(object sender, EventArgs e) 
    { 
    ... 
    OnInputBound(this, new InputEventArgs(postName, value)); 

    //I would like to try something like this but does not work: 
    //value = OnInputBound(this, new InputEventArgs(postName, value)); 

    //Continue with new value... 
    } 
} 

Dans d'autres parties de l'application, ils enregistrent l'événement normalement comme ceci:

protected override void CreateChildControls() 
{ 
    MyForm.OnInputBound += new EventHandler<InputEventArgs>(MyForm_OnInputBound); 
} 

void MyForm_OnInputBound(object sender, SingleForm.InputEventArgs e) 
{ 
    e.Value = "new value"; 
} 

Remarquez comment je Je suis en train de changer l'argument pour la MasterClass. Cela ne fonctionne évidemment pas, mais comment pourrais-je gonfler cette valeur?

Répondre

1

Vous devez conserver une référence à l'instance InputEventArgs afin que vous puissiez lire le Value de celui-ci après l'événement a été soulevée:

void btnSubmit_Click(object sender, EventArgs e) 
{ 
    ... 
    InputEventArgs eventArgs = new InputEventArgs(postName, value); 
    OnInputBound(this, eventArgs); 

    value = eventArgs.Value; 

    //Continue with new value... 
} 

Une chose à prendre en compte ici est qu'il y sont des scénarios qui peuvent conduire à des résultats inattendus:

  • l'auditeur peut choisir de lancer un fil et traiter l'appel de manière asynchrone
  • Il peut y avoir un certain nombre d'auditeurs pour le même événement, dont chacun peut attribuer une valeur différente. Votre code ne verra bien entendu que le dernier assigné, mais vous n'aurez aucun contrôle sur l'ordre dans lequel les auditeurs sont appelés.

Prenons le cas suivant, par exemple, (premier point ci-dessus):

void MyForm_OnInputBound(object sender, SingleForm.InputEventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(state => 
    { 
     // perform some potentially lengthy database lookup or such 
     // and then assign a new value 
     e.Value = "new value"; 
    }); 

} 

Dans ce cas, il n'y a aucune garantie que la valeur est affectée avant votre code btnSubmit_Click reprend la valeur « nouvelle » de l'instance InputEventArgs.

Questions connexes