99 votes

Passer le paramètre à l'EventHandler

J'ai les éléments suivants EventHandler à laquelle j'ai ajouté un paramètre MusicNote musique :

public void PlayMusicEvent(object sender, EventArgs e,MusicNote music)
{
    music.player.Stop();
    System.Timers.Timer myTimer = (System.Timers.Timer)sender;
    myTimer.Stop();
}

J'ai besoin d'ajouter le gestionnaire à un Timer comme ça :

myTimer.Elapsed += new ElapsedEventHandler(PlayMusicEvent(this, e, musicNote));

mais je reçois l'erreur :

"Nom de la méthode attendu"

EDIT : Dans ce cas, je passe juste e depuis la méthode qui contient ce bout de code, comment passerais-je la propre valeur du timer ? EventArgs ?

250voto

MagnatLU Points 2815

Timer.Elapsed attend une méthode de signature spécifique (avec des arguments object y EventArgs ). Si vous voulez utiliser votre PlayMusicEvent avec un argument supplémentaire évalué lors de l'inscription à l'événement vous pouvez utiliser l'expression lambda comme adaptateur :

myTimer.Elapsed += new ElapsedEventHandler((sender, e) => PlayMusicEvent(sender, e, musicNote));

Editar: vous pouvez également utiliser la version courte :

myTimer.Elapsed += (sender, e) => PlayMusicEvent(sender, e, musicNote);

5voto

Dmitry Polyanitsa Points 662

Si je comprends bien votre problème, vous appelez une méthode au lieu de la passer en paramètre. Essayez ce qui suit :

myTimer.Elapsed += PlayMusicEvent;

public void PlayMusicEvent(object sender, ElapsedEventArgs e)
{
    music.player.Stop();
    System.Timers.Timer myTimer = (System.Timers.Timer)sender;
    myTimer.Stop();
}

Mais vous devez réfléchir à l'endroit où stocker votre note.

1voto

Fischermaen Points 7006

Malheureusement, je dois dire que cela ne fonctionne pas ! Les gestionnaires d'événements utilisent toujours le même schéma : 1. argument : l'expéditeur et 2. argument : les arguments de l'événement. Ces arguments d'événement peuvent être spéciaux, mais il doit bien y avoir quelqu'un, qui les remplit sur appel ! Dans votre échantillon spécial, il n'y a personne qui puisse vous fournir des arguments supplémentaires ! Timer.Tick attend une méthode d'événement avec un objet comme premier paramètre et EventArgs comme second. Donc vous ne pouvez pas définir votre fonction !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X