2010-07-09 8 views
5

Desidero sapere se un controllo ha un metodo assegnato nell'evento Click.Verificare se il controllo ha eventi su Click EventHandler

Button b = new Button(); 
b.Click += (sender, e) => { }; 

/* What I want */ 
b.Click.Count // 1 

Ho bisogno di qualcosa che possa almeno dirmi se il controllo ha o meno qualche metodo sull'evento click.

+0

si consiglia di dare un'occhiata qui: http://stackoverflow.com/questions/1246116/in-c-why-cant-i-test-if-a -event-handler-is-null-anywhere-of-the-class/1246149 # 1246149 –

risposta

3

Si potrebbe leggere un po 'in questo argomento Determine list of event handlers bound to event, sembra che possa essere in qualche modo correlato a ciò che si sta tentando di fare.

+0

Riflessione, ero quasi sicuro che sarebbe stato l'unico modo, e credo di essere aveva ragione ... Grazie! – BrunoLM

1

Non puoi farlo. L'evento è solo aggiungere/rimuovere metodi per aggiungere delegati alla catena. Solo la classe che ha un evento può sapere se ci sono iscritti all'evento.

Ancora di più, non è necessario sapere se ci sono abbonati all'evento di un controllo. perché hai bisogno di questa informazione?

+4

Credo che stia cercando di evitare la sottoscrizione multipla – PerlDev

0

Se avete bisogno di prova, se il delegato esiste/sottoscritto, si può provare - = prima, in corsa cattura + =

0

È solo possibile farlo dal di dentro la classe che possiede il gestore di eventi (Button in questo caso). All'interno della classe Button è possibile eseguire il test per Click != null per verificare la presenza di abbonati. Sfortunatamente, poiché sospetto che lo Button sia la classe quadro, sei sfortunato.

5

Ho controllato il tema suggerito da Norman H (Determine list of event handlers bound to event)

Ha funzionato per me in caso di "EventClick"

hasClickEventHandler = HasEventHandler(buttonControl, "EventClick"); 
    Assert.AreEqual(hasClickEventHandler, true); 


    private bool HasEventHandler(Control control, string eventName) 
    { 
     EventHandlerList events = 
      (EventHandlerList) 
      typeof(Component) 
      .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance) 
      .GetValue(control, null); 

     object key = typeof(Control) 
      .GetField(eventName, BindingFlags.NonPublic | BindingFlags.Static) 
      .GetValue(null); 

     Delegate handlers = events[key]; 

     return handlers != null && handlers.GetInvocationList().Any(); 
    } 

valori possibili per eventName sono nell'output del questo comando Campi:

typeof(Control).GetFields(BindingFlags.NonPublic | BindingFlags.Static) 

valori Così l'possibili:

... 
[6]: {System.Object EventAutoSizeChanged} 
[7]: {System.Object EventKeyDown} 
[8]: {System.Object EventKeyPress} 
[9]: {System.Object EventKeyUp} 
[10]: {System.Object EventMouseDown} 
[11]: {System.Object EventMouseEnter} 
[12]: {System.Object EventMouseLeave} 
[13]: {System.Object EventMouseHover} 
[14]: {System.Object EventMouseMove} 
[15]: {System.Object EventMouseUp} 
[16]: {System.Object EventMouseWheel} 
[17]: {System.Object EventClick} 
[18]: {System.Object EventClientSize} 
[19]: {System.Object EventDoubleClick} 
[20]: {System.Object EventMouseClick} 
[21]: {System.Object EventMouseDoubleClick} 
[22]: {System.Object EventMouseCaptureChanged} 
[23]: {System.Object EventMove} 
[24]: {System.Object EventResize} 
[25]: {System.Object EventLayout} 
[26]: {System.Object EventGotFocus} 
[27]: {System.Object EventLostFocus} 
[28]: {System.Object EventEnabledChanged} 
[29]: {System.Object EventEnter} 
[30]: {System.Object EventLeave} 
[31]: {System.Object EventHandleCreated} 
[32]: {System.Object EventHandleDestroyed} 
[33]: {System.Object EventVisibleChanged} 
[34]: {System.Object EventControlAdded} 
[35]: {System.Object EventControlRemoved} 
[36]: {System.Object EventChangeUICues} 
[37]: {System.Object EventSystemColorsChanged} 
[38]: {System.Object EventValidating} 
[39]: {System.Object EventValidated} 
[40]: {System.Object EventStyleChanged} 
[41]: {System.Object EventImeModeChanged} 
[42]: {System.Object EventHelpRequested} 
[43]: {System.Object EventPaint} 
[44]: {System.Object EventInvalidated} 
[45]: {System.Object EventQueryContinueDrag} 
[46]: {System.Object EventGiveFeedback} 
[47]: {System.Object EventDragEnter} 
[48]: {System.Object EventDragLeave} 
[49]: {System.Object EventDragOver} 
[50]: {System.Object EventDragDrop} 
[51]: {System.Object EventQueryAccessibilityHelp} 
[52]: {System.Object EventBackgroundImage} 
[53]: {System.Object EventBackgroundImageLayout} 
[54]: {System.Object EventBindingContext} 
[55]: {System.Object EventBackColor} 
[56]: {System.Object EventParent} 
[57]: {System.Object EventVisible} 
[58]: {System.Object EventText} 
[59]: {System.Object EventTabStop} 
[60]: {System.Object EventTabIndex} 
[61]: {System.Object EventSize} 
[62]: {System.Object EventRightToLeft} 
[63]: {System.Object EventLocation} 
[64]: {System.Object EventForeColor} 
[65]: {System.Object EventFont} 
[66]: {System.Object EventEnabled} 
[67]: {System.Object EventDock} 
[68]: {System.Object EventCursor} 
[69]: {System.Object EventContextMenu} 
[70]: {System.Object EventContextMenuStrip} 
[71]: {System.Object EventCausesValidation} 
[72]: {System.Object EventRegionChanged} 
[73]: {System.Object EventMarginChanged} 
[74]: {System.Object EventPaddingChanged} 
[75]: {System.Object EventPreviewKeyDown} 
+0

Eccellente! La giusta combinazione di ... funziona. :) Grazie. –