Bonsoir,
Comment obtenir par code la liste des évènements associés à un controle?
Merci
Version imprimable
Bonsoir,
Comment obtenir par code la liste des évènements associés à un controle?
Merci
Tu peux utiliser la reflexion.
Code:
1
2
3 For Each EventInfo e In Control.GetType().GetEvents() MsgBox e.Name Next
Je bloquais sur:
Mais maintenant c'est résolu:Code:Dim RefEvnt As Reflection.EventInfo() = type1.GetEvents
Code:
1
2
3 For Each EventInfo In Control.GetType().GetEvents() MsgBox(EventInfo.ToString) Next
Merci à vous deux!
J'ai un petit soucis, je vous explique:
Je souhaiterai que l'utilisateur de mon application ait la possibilité d'ajouter des évènements aux controles et ce de façon dynamique.
Pour cela, je pensais utiliser trois listbox, l'une pour le choix du controle, l'autre pour le choix de l'évènement, et enfin une dernière pour le choix de la méthode.
Je rencontre déjà un certain problème concernant la liste des évènements(je n'ai pas encore bien tout assimilé concernant les délégués, gestionnaires, etc...).
Mon problème et que je me retrouve avec une liste d'EventInfo et que j'aimerai faire correspondre cette liste avec les évènements concernés.
En gros, je n'arrive pas a convertir un EventInfo en Event ou je ne sais quoi qui pourrai me permettre grâce au AddHandler d'ajouter cet évènement au controle concerné.
Alors comment puis-je faire sans tout dégueulasser mon code?
Utilise la méthode EventInfo.AddEventHandler
En fouillant un peu la doc (ou même l'intellisense...) tu l'aurais trouvée ;)
J'aimerai bien, mais là franchement je suis un peu paumé..! :cry:
Imaginons que sur un formulaire, j'ai un bouton (nommé MonBouton) et un label (MonLabel).
Je souhaiterai qu'à partir d'une ListBox un utilisateur choisisse un évènement qui s'appliquerai à MonLabel (MaMethode) .
Si dans cet exemple, on souhaite que lorsqu'on click (System.EventHandler Click) sur MonBouton cela entraine l'écriture dans MonLabel du texte définit par MaMethode, comment dois-je utiliser .AddEventHandler???
Comme code j'ai:
Je souhaite réutiliser les évènements déjà présents pour le controle (System.EventHandler si j'ai bien compris).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 For Each EventInfo In MonBouton.GetType().GetEvents (...) Next If EventInfo.ToString = ItemListBox.ToString Then ' ItemListBox correspond au choix de l'utilisateur, ' suivant l'exemple: ItemListBox = System.EventHandler Click EventInfo.AddEventHandler(MonBouton,???) ' Délégué? (...) End If
Je ne sais pas quoi mettre comme délégué pour le AddEventHandler???
J'ai bien un CreateDelegate pour System.EventHandler (merci Intellisense), mais je ne sais pas comment l'utiliser.
Paramètres de AddEventHandler :
- target : l'objet pour lequel tu ajoutes un handler d'évènement (MonBouton par exemple)
- handler : un delegate qui pointe sur la méthode à appeler
Pour obtenir le delegate à passer en paramètre, 2 méthodes :
- si tu connais le type de delegate (= le type de l'évènement), tu peux le créer directement comme ça (exemple pour l'évènement Click) :
- si tu ne connais pas à l'avance le type de delegate (ce qui est ton cas à priori, puisque l'évènement est choisi par l'utilisateur), utilise Delegate.CreateDelegate. Il y a différentes surcharges, la plus simple à mon avis est celle-ci :Code:New EventHandler(MonBouton_Click)
Au final ça te donne quelque chose comme ça :Code:Delegate.CreateDelegate(EventInfo.EventHandlerType, Me, "MonBouton_Click")
Code:EventInfo.AddEventHandler(MonBouton, Delegate.CreateDelegate(EventInfo.EventHandlerType, Me, "MonBouton_Click"))
C'est çà! Merci beaucoup!
Me reste plus qu'à bien maîtriser tout çà.
Par contre fais attention, tu ne peux pas ajouter n'importe quelle méthode comme handler de n'importe quel évènement : il faut que la signature de la méthode (types des paramètres et type de retour) correspondent à celle du delegate de l'évènement.
Par exemple pour Click il faut une méthode avec cette signature
Alors que pour DoubleClick ce serait ça :Code:Public Sub unHandlerDeClick(ByVal sender As Object, ByVal e As EventArgs)
Si tu essaies d'ajouter unHandlerDeClick comme handler de l'évènement MouseUp, ça provoquera une exception (et inversement).Code:Public Sub unHandlerDeMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
Ok, çà m'évitera de le demander... ;)