Gestionnaire d'événements avec des arguments personnalisés
J'ai été à la recherche d'une réponse pour environ une heure sur Google mais je n'ai pas trouvé exactement ce que je cherche.
En gros, j'ai une statique de la classe Helper qui permet d'effectuer de nombreuses choses que je fais souvent dans mon Application. Dans ce cas, j'ai une méthode nommée "CreateDataContextMenu" qui crée un menu contextuel sur un contrôle TreeView.
public static void CreateDataContextMenu(Form parent, TreeView owner, string dataType)
{ ... }
TreeView propriétaire est le contrôle dans laquelle j'associe mon menu contextuel.
Puis plus tard, j'ai ajouter un événement Click d'un MenuItem comme ceci:
menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click);
Le problème que j'ai ici, c'est que je veux passer "propriétaire" et "type de données" comme arguments à la menuItemFolder_Click événement.
J'ai essayé le suivant:
menuItemFolder.Click += new System.EventHandler(menuItemFolder_Click(sender,e,owner,dataType));
(...)
private static void menuItemFolder_Click(object sender, System.EventArgs e, Treeview owner, string dataType)
{...}
Mais il ne fonctionne pas du tout. Il pourrait être très naïf de ma part de le faire de cette façon mais je ne suis pas très à l'aise avec le gestionnaire d'événement encore.
Aucune idée sur comment je pourrais faire?
Ma première hypothèse est que j'ai besoin de créer mon propre Gestionnaire d'événements pour ce cas précis. Je vais dans la bonne direction avec qui?
OriginalL'auteur Sasha | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Vous devez créer un expression lambda qui appelle une méthode avec les paramètres supplémentaires:
Méthode plus claire, et de loin. Pour ceux qui ne sont pas utilisés à des expressions lambda, comme moi, il serait peut-être une bonne idée pour montrer que "expéditeur" et " e " peut être transmis à YourMethod trop.
Comment se désinscrire du même événement?
Stocker le lambda dans une variable.
Exactement comment se désinscrire? À l'aide de quelque chose de
Func<int,int,int> f= (a,b)=>a+b;
a besoin d'une valeur de retour.OriginalL'auteur SLaks
Admission honnête: je n'ai pas essayé le code ci-dessous.
Je pense que la raison
ne fonctionne pas c'est que vous êtes réellement le passage au Système.EventHandler () le résultat de l'invocation de menuItemFolder_Click () avec les paramètres fournis. Vous n'êtes pas en passant un pointeur vers la fonction elle-même.
Essayer d'écrire une autre fonction qui implémente les détails de menuItemFolder_Click (). Voir si quelque chose comme
puis d'appeler la fonction dans menuItemFolder_Click ().
OriginalL'auteur Shredderroy
Je pense que le code le plus simple serait celui-ci:
OriginalL'auteur CarLoOSX