Aby utworzyć nową procedurę obsługi zdarzeń w kontrolce, możesz to zrobić
c.Click += new EventHandler(mainFormButton_Click);
albo to
c.Click += mainFormButton_Click;
i aby usunąć moduł obsługi zdarzeń, możesz to zrobić
c.Click -= mainFormButton_Click;
Ale jak usunąć wszystkie moduły obsługi zdarzeń ze zdarzenia?
c.Click = null
?Clear
Najwyraźniej prosta metoda była zbyt wielkim wysiłkiemOdpowiedzi:
Znalazłem rozwiązanie na forach MSDN . Przykładowy kod poniżej usunie wszystkie
Click
zdarzenia zbutton1
.źródło
RemoveClickEvent
początku z:FieldInfo f1 = typeof(Button)
? Dostaję zero,GetField
jeśli użyjęControl
.ObservableCollection.CollectionChanged += null;
Za bardzo utrudniacie sobie to. To takie proste:
źródło
FindClicked = null;
co jest raczej prostsze.kinect.ColorFrameReady -= MyEventHander
działa, ale nie maGetInvocationList()
metody instancji kinect umożliwiającej iterację nad ich delegatami.GetInvocationList
nie znaleziono.Od usunięcia wszystkich programów obsługi zdarzeń :
źródło
Zaakceptowana odpowiedź nie jest pełna. Nie działa w przypadku zdarzeń zadeklarowanych jako {dodaj; usunąć;}
Oto działający kod:
źródło
BindingFlags.Public
w pierwszymGetField
wywołaniu.Usunięcie nieistniejącej procedury obsługi zdarzeń nie szkodzi. Więc jeśli wiesz, jakie mogą być programy obsługi, możesz po prostu usunąć je wszystkie. Właśnie miałem podobny przypadek. W niektórych przypadkach może to pomóc.
Lubić:
źródło
Właściwie używam tej metody i działa ona idealnie. Byłem „zainspirowany” kodem napisanym tutaj przez Aeonhacka .
Pole MyEventEvent jest ukryte, ale istnieje.
Debugowanie pozwala zobaczyć, jak
d.target
obiekt faktycznie obsługuje zdarzenie, orazd.method
jego metodę. Musisz go tylko usunąć.Działa świetnie. Koniec z obiektami nie będącymi GC z powodu procedur obsługi zdarzeń.
źródło
Nienawidziłem przedstawionych tutaj kompletnych rozwiązań, zrobiłem miks i przetestowałem teraz, pracowałem dla każdego modułu obsługi zdarzeń:
Łatwy! Dzięki za Stephena Punaka.
Użyłem go, ponieważ używam ogólnej lokalnej metody usuwania delegatów, a lokalna metoda została wywołana po różnych przypadkach, gdy ustawiono różnych delegatów.
źródło
Jeśli naprawdę musisz to zrobić ... zajmie to refleksję i sporo czasu, aby to zrobić. Procedury obsługi zdarzeń są zarządzane w postaci mapy zdarzenia do delegowania wewnątrz kontrolki. Musisz
Krótko mówiąc, dużo pracy. Jest to teoretycznie możliwe ... Nigdy czegoś takiego nie próbowałem.
Sprawdź, czy możesz lepiej kontrolować / zdyscyplinować fazę subskrypcji i rezygnacji z kontroli.
źródło
Stephen ma rację. To bardzo łatwe:
źródło
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Właśnie znalazłem Jak zawiesić zdarzenia podczas ustawiania właściwości kontrolki WinForm . Spowoduje to usunięcie wszystkich zdarzeń z kontrolki:
źródło
Łał. Znalazłem to rozwiązanie, ale nic nie działało tak, jak chciałem. Ale to jest takie dobre:
źródło
Ta strona bardzo mi pomogła. Kod, który dostałem stąd, miał usunąć zdarzenie kliknięcia z przycisku. Muszę usunąć zdarzenia podwójnego kliknięcia z niektórych paneli i zdarzenia kliknięcia z niektórych przycisków. Zrobiłem więc rozszerzenie kontrolne, które usunie wszystkie programy obsługi zdarzeń dla określonego zdarzenia.
Teraz użycie tego rozszerzenia. Jeśli chcesz usunąć zdarzenia kliknięcia z przycisku,
Jeśli chcesz usunąć zdarzenia podwójnego kliknięcia z panelu,
Nie jestem ekspertem w C #, więc jeśli są jakieś błędy, proszę wybacz mi i uprzejmie daj mi znać o tym.
źródło
Czasami musimy współpracować z kontrolkami ThirdParty i musimy zbudować te niezręczne rozwiązania. Na podstawie odpowiedzi @Anoop Muraleedharan stworzyłem to rozwiązanie z typem wnioskowania i obsługą ToolStripItem
I możesz użyć tego w ten sposób
źródło
Znalazłem inne działające rozwiązanie Douglasa .
Ta metoda usuwa wszystkie procedury obsługi zdarzeń, które są ustawione dla określonego zdarzenia routera w elemencie.
Użyj tego jak
Pełny kod:
źródło
usuwa wszystkie programy obsługi przycisku: save.RemoveEvents ();
źródło
Cóż, tutaj jest inne rozwiązanie do usunięcia powiązanego zdarzenia (jeśli masz już metodę obsługi zdarzeń dla kontroli):
źródło
To nie jest odpowiedź na PO, ale pomyślałem, że opublikuję to tutaj, na wypadek, gdyby mógł pomóc innym.
źródło
Znalazłem tę odpowiedź i prawie pasuje do moich potrzeb. Dzięki SwDevMan81 dla klasy. Zmodyfikowałem go, aby umożliwić tłumienie i wznawianie poszczególnych metod, i pomyślałem, że opublikuję go tutaj.
źródło