12
votes

Comment puis-je savoir si un événement .NET est déjà manipulé?

J'ai écrit du code pour gérer un événement comme suit:

If myObject.myEvent is not handled Then
  AddHandler myObject.myEvent, AddressOf myFunction
End If


0 commentaires

8 Réponses :


14
votes

En supposant que ce n'est pas votre code qui publie l'événement, vous ne pouvez pas. L'idée est que les abonnés sont isolés les uns des autres - vous ne pouvez pas savoir d'autres abonnés d'événements, soulevez l'événement vous-même, etc.

Si le problème est que vous êtes l'ajout de votre propre gestionnaire plusieurs fois, vous devriez être capable de résoudre ce problème en gardant une trace de si vous avez ajouté un gestionnaire . L'idée de Steven de supprimer le gestionnaire avant d'ajouter que c'est une solution de contournement intéressante: elle est valable pour tenter de supprimer un gestionnaire, même lorsqu'il n'est pas abonné. Cependant, je considérerais cela comme une solution de contournement à votre application ne sachant pas vraiment ce que cela devrait faire. C'est une très bonne solution à court terme, mais je crains de le laisser à plus long terme.


2 commentaires

"Doc, ça fait mal quand je fais ça." "Alors ne fais pas ça."


Vous avez raison d'être un hachoir, surtout depuis que vous laissez votre événement accroché peut effectivement provoquer une fuite de mémoire.



8
votes

soit:

  1. Ne pas ajouter votre gestionnaire plus que une fois.

  2. tentative de retirer le gestionnaire juste avant de l'ajouter.


3 commentaires

Si vous essayez de supprimer le gestionnaire et que cela n'existe pas, il lancera une nullreferenceException


Je pense que cela jette une référence nulle aussi, mais ce n'est pas le cas. L'erreur NULL est lancée si l'objet n'existe pas. Supprimer le gestionnaire sur MyObject.Myevent, je vais lancer une erreur si MyObject n'existe pas.


J'utilise des événements de congé et de MouseDown pour allumer et éteindre les événements de mon application. J'ai constaté que si je me suis fermé à l'intérieur et à l'extérieur de mon contrôle, les événements seraient manqués d'une manière ou d'une autre en raison d'un décalage ou de quelque chose et je trouverais mon contrôle pour obtenir le même gestionnaire ajouté plusieurs fois - pas bien exactement la raison. De toute façon, il a provoqué des choses folles et des comportements inattendus. Une fois que j'ai ajouté mon événement de congé pour d'abord retirer le gestionnaire avant de l'ajouter ... tout a été corrigé! Facile Fix / Hack. Merci.



0
votes

Enregistrez vos résultats du gestionnaire d'événements à la base de données / session, puis lisez-les à nouveau pour vérifier si l'événement a déjà été manipulé.


0 commentaires

4
votes

Il n'y a aucun moyen de dire qu'un gestionnaire est déjà attaché mais vous pouvez appeler en toute sécurité SUPPORTHANDLER sur l'événement avant d'appeler Addhandler. S'il n'y a pas déjà un gestionnaire, RetirerHandler n'aura aucun effet.


2 commentaires

Le membre de l'événement ne sera que NULL s'il n'y a pas de gestionnaire de gestionnaires. Mais il n'y a pas de bon moyen de dire si un gestionnaire spécifique est déjà accroché.


J'utilise des événements de congé et de MouseDown pour allumer et éteindre les événements de mon application. J'ai constaté que si je me suis fermé à l'intérieur et à l'extérieur de mon contrôle, les événements seraient manqués d'une manière ou d'une autre en raison d'un décalage ou de quelque chose et je trouverais mon contrôle pour obtenir le même gestionnaire ajouté plusieurs fois - pas bien exactement la raison. De toute façon, il a provoqué des choses folles et des comportements inattendus. Une fois que j'ai ajouté mon événement de congé pour d'abord retirer le gestionnaire avant de l'ajouter ... tout a été corrigé! Facile Fix / Hack. Merci.



-3
votes

Vous pouvez utiliser iShandlecreated (code> propriété code> pour vérifier votre événement a déjà une poignée ou non.

  If e.Control.IsHandleCreated = False Then
            AddHandler e.Control.KeyPress, AddressOf TextBox_keyPress
  End If


1 commentaires

ISHANDLECARED Vérifie pour une poignée de fenêtre, elle n'a rien à voir avec la recherche d'abonnés d'événements



4
votes

Je sais que c'est un ancien poste, mais je voulais juste ajouter une solution à ceux qui viennent à la recherche de cette direction ...

vb.net crée une variable de membre privé spécial dans le modèle de Événement que vous pouvez ensuite utiliser pour tester sans rien. xxx

réponse provenant d'ici: Déterminez si un événement a été attaché à ce jour


0 commentaires

1
votes

Retirez le gestionnaire, puis ajoutez-le. De cette façon, il ne sera jamais dupliqué. Méfiez-vous de l'erreur de référence NULL si votre objet n'existe pas. Je me suis arrêté aussi et peut arriver lorsque vous retirez le gestionnaire en dehors du sous-fonctionnement où le gestionnaire est créé. xxx


0 commentaires

0
votes

Je sais que je suis quelques années de retard au jeu, mais vous pouvez toujours avoir une variable de classe, puis la définir après le fait. Ce n'est pas une façon totalement trempée de faire des choses, mais c'est mieux que d'espérer que vous n'avez pas eu quelque chose ou que vous l'ajoutez à chaque fois. Dans mon cas, j'ai utilisé cela dans une application WinForms Si je voulais ajouter un gestionnaire pour faire glisser et tomber sur une surface DataGridView. Je voulais arrêter cette fonctionnalité si une partie d'un autre DataGridView n'était pas encore remplie complètement qu'elle dépendait.

Ce serait donc comme ceci:

niveau de classe xxx

constructeur: xxx

Méthode qui détermine le problème: xxx


0 commentaires