2010-07-09 14 views
5

Quiero saber si un control tiene un método asignado en el evento Click.Comprueba si el control tiene eventos en Click EventHandler

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

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

Necesito algo que puede al menos dime si el control tiene o no algún método en el evento click.

+0

es posible que desee echar un vistazo aquí: http://stackoverflow.com/questions/1246116/in-c-why-cant-i-test-if-a -event-handler-is-null-anywhere-outside-of-the-class/1246149 # 1246149 –

Respuesta

3

Puede leer un poco sobre este tema Determine list of event handlers bound to event, parece que puede estar relacionado con lo que está intentando hacer.

+0

Reflexión, estaba casi seguro de que sería la única manera, y supongo que tenía razón ... ¡Gracias! – BrunoLM

1

No puede hacer eso. El evento es simplemente agregar/eliminar métodos para agregar delegado a la cadena. Solo la clase que tiene un evento puede saber si hay suscriptores al evento.

Aún más, no debería necesitar saber si hay suscriptores al evento de un control. ¿Por qué necesita esta información?

+4

Supongo que está tratando de evitar la suscripción múltiple – PerlDev

0

Si necesita prueba si existe el delegado/suscrito, puede intentar - = en primer lugar, en la carrera de captura + =

0

Sólo puede hacerlo desde dentro de la clase que posee el controlador de eventos (Button en este caso) Dentro de la clase Button puede hacer una prueba de Click != null para ver si hay suscriptores. Desafortunadamente, como sospecho que el Button es la clase framework, no tiene suerte.

5

He comprobado el tema sugerido por Norman H (Determine list of event handlers bound to event)

Se trabajó para mí en caso de "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(); 
    } 

Los valores posibles para eventName están en la salida de este GetFields comando:

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

valores posibles: Así que la

... 
[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

¡Excelente! La combinación correcta de ... funciona. :) Gracias. –

Cuestiones relacionadas