Pour créer un nouveau gestionnaire d'événements sur un contrôle, vous pouvez le faire
c.Click += new EventHandler(mainFormButton_Click);
ou ca
c.Click += mainFormButton_Click;
et pour supprimer un gestionnaire d'événements, vous pouvez le faire
c.Click -= mainFormButton_Click;
Mais comment supprimer tous les gestionnaires d'événements d'un événement?
c.Click = null
?Clear
méthode simple était apparemment trop d'effortRéponses:
J'ai trouvé une solution sur les forums MSDN . L'exemple de code ci-dessous supprimera tous les
Click
événements debutton1
.la source
RemoveClickEvent
commencer parFieldInfo f1 = typeof(Button)
:? J'obtiens nullGetField
si j'utiliseControl
.ObservableCollection.CollectionChanged += null;
Vous les gars rendez cette façon trop dure pour vous-mêmes. C'est aussi simple que ça:
la source
FindClicked = null;
ce qui est plutôt simple.kinect.ColorFrameReady -= MyEventHander
fait, mais il n'existe aucuneGetInvocationList()
méthode sur les instances Kinect pour itérer sur leurs délégués.GetInvocationList
pas trouvé.De la suppression de tous les gestionnaires d'événements :
la source
La réponse acceptée n'est pas complète. Cela ne fonctionne pas pour les événements déclarés comme {add; retirer;}
Voici le code de travail:
la source
BindingFlags.Public
lors du premierGetField
appel.Il ne fait aucun mal de supprimer un gestionnaire d'événements inexistant. Donc, si vous savez quels gestionnaires il peut y avoir, vous pouvez simplement les supprimer tous. Je viens d'avoir un cas similaire. Cela peut aider dans certains cas.
Comme:
la source
J'utilise en fait cette méthode et cela fonctionne parfaitement. J'ai été «inspiré» par le code écrit par Aeonhack ici .
Le champ MyEventEvent est masqué, mais il existe.
Débogage, vous pouvez voir comment
d.target
l'objet gère réellement l'événement etd.method
sa méthode. Vous n'avez qu'à le supprimer.Cela fonctionne très bien. Plus d'objets non en cours de GC à cause des gestionnaires d'événements.
la source
Je détestais toutes les solutions complètes présentées ici, j'ai fait un mélange et testé maintenant, travaillé pour n'importe quel gestionnaire d'événements:
Facile! Merci pour Stephen Punak.
Je l'ai utilisé car j'utilise une méthode locale générique pour supprimer les délégués et la méthode locale a été appelée après différents cas, lorsque différents délégués sont définis.
la source
Si vous devez vraiment le faire ... cela prendra de la réflexion et un certain temps pour le faire. Les gestionnaires d'événements sont gérés dans une mappe d'événement à délégué à l'intérieur d'un contrôle. Vous auriez besoin de
Bref, beaucoup de travail. C'est possible en théorie ... Je n'ai jamais essayé quelque chose comme ça.
Voyez si vous pouvez avoir un meilleur contrôle / discipline sur la phase d'abonnement-désabonnement pour le contrôle.
la source
Stephen a raison. C'est très facile:
la source
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Je viens de trouver Comment suspendre des événements lors de la définition d'une propriété d'un contrôle WinForms . Il supprimera tous les événements d'un contrôle:
la source
Sensationnel. J'ai trouvé cette solution, mais rien n'a fonctionné comme je le voulais. Mais c'est tellement bon:
la source
Cette page m'a beaucoup aidé. Le code que j'ai obtenu ici était destiné à supprimer un événement de clic d'un bouton. Je dois supprimer les événements de double-clic de certains panneaux et cliquer sur les événements de certains boutons. J'ai donc fait une extension de contrôle, qui supprimera tous les gestionnaires d'événements pour un certain événement.
Maintenant, l'utilisation de cette extension. Si vous devez supprimer les événements de clic d'un bouton,
Si vous devez supprimer des événements de double-clic d'un panneau,
Je ne suis pas un expert en C #, donc s'il y a des bugs s'il vous plaît pardonnez-moi et veuillez me le faire savoir.
la source
Parfois, nous devons travailler avec des contrôles ThirdParty et nous devons créer ces solutions maladroites. Basé dans la réponse @Anoop Muraleedharan, j'ai créé cette solution avec le type d'inférence et le support ToolStripItem
Et vous pouvez l'utiliser comme ça
la source
J'ai trouvé une autre solution de travail par Douglas .
Cette méthode supprime tous les gestionnaires d'événements qui sont définis sur un événement de routage spécifique sur un élément.
Utilisez-le comme
Code complet:
la source
supprime tous les gestionnaires du bouton: save.RemoveEvents ();
la source
Eh bien, voici une autre solution pour supprimer un événement associé (si vous avez déjà une méthode pour gérer les événements pour le contrôle):
la source
Ce n'est pas une réponse au PO, mais j'ai pensé que je posterais ceci ici au cas où cela pourrait aider les autres.
la source
J'ai trouvé cette réponse et elle correspondait presque à mes besoins. Merci à SwDevMan81 pour la classe. Je l'ai modifié pour permettre la suppression et la reprise de méthodes individuelles, et j'ai pensé le publier ici.
la source