Le modèle d'événements dans Visual Basic permet de réagir aux actions des utilisateurs via des gestionnaires d'événements qui sont liés aux contrôles. Cela est crucial pour les programmes avec interface graphique (GUI), où chaque élément peut déclencher ses propres événements.
Dans le classique VB6, la gestion des événements était mise en œuvre avec une liaison statique contrôle – méthode. Dans VB.NET et WinForms, le modèle est devenu plus flexible : maintenant, plusieurs gestionnaires peuvent être liés à un seul événement, et la liaison dynamique est prise en charge via AddHandler/RemoveHandler.
La difficulté typique est l'ajout dynamique de contrôles et la gestion de leurs événements. Si on ne se désinscrit pas des événements ou si on lie mal le gestionnaire, cela peut entraîner des fuites de mémoire, des appels en double, et une perte de contrôle sur le comportement de l'interface utilisateur.
Lorsque vous créez des contrôles dynamiquement, utilisez AddHandler pour vous abonner et RemoveHandler pour supprimer correctement le gestionnaire. Surveillez le cycle de vie des contrôles : si un contrôle est détruit, il est nécessaire de se désinscrire des gestionnaires, sinon des références "pendantes" resteront.
Exemple de code :
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("Bouton cliqué !") End Sub
Caractéristiques clés :
Que se passera-t-il si le gestionnaire d'événements est connecté plusieurs fois au même élément ?
Le gestionnaire sera appelé autant de fois qu'il a été ajouté via AddHandler, ce qui peut entraîner une exécution inattendue et multiple de la logique.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Lorsque le bouton est cliqué, Handler sera appelé 2 fois
Peut-on utiliser une méthode avec des paramètres différents de la signature de l'événement ?
Non, la signature de la méthode gestionnaire doit strictement correspondre au délégué de l'événement (par exemple, Sub Handler(sender As Object, e As EventArgs)). Le compilateur renverra une erreur dans le cas contraire.
RemoveHandler supprime-t-il toutes les occurrences du gestionnaire s'il a été ajouté plusieurs fois ?
Non, RemoveHandler enlève uniquement une souscription par appel. Si le gestionnaire a été ajouté plusieurs fois, il faut le supprimer autant de fois, sinon une instance restera liée.
100 boutons sont créés dynamiquement dans une boucle, et un gestionnaire est attribué à tous, mais RemoveHandler n'est pas appelé. Après la fermeture du formulaire, l'événement continue à "vivre", entraînant des plantages fréquents.
Avantages:
Inconvénients:
Un gestionnaire nommé est ajouté à chaque contrôle dynamique dans la collection, et lors de la suppression d'un contrôle, tous les gestionnaires sont explicitement désinscrits dans une boucle.
Avantages:
Inconvénients: