2010-07-09 3 views
5

Я хочу знать, имеет ли элемент управления метод, назначенный на событие Click.Проверьте, есть ли у элемента управления события в Click EventHandler

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

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

Мне нужно что-то, что может по крайней мере сказать мне, есть ли у элемента управления какой-либо метод в событии клика.

+0

Вы можете захотеть взглянуть здесь: http://stackoverflow.com/questions/1246116/in-c-why-cant-i-test-if-a -event-handler-is-null-where-outside-of-the-class/1246149 # 1246149 –

ответ

3

Возможно, вы читаете эту тему Determine list of event handlers bound to event, похоже, что это может быть связано с тем, что вы пытаетесь сделать.

+0

Отражение, я был почти уверен, что это будет единственный способ, и я думаю, что я был прав ... Спасибо! – BrunoLM

1

Вы не можете этого сделать. Событие - это просто добавить/удалить методы для добавления делегата в цепочку. Только класс, который имеет событие, может знать, есть ли подписчики на мероприятие.

Более того, вам не нужно знать, есть ли подписчики на случай контроля. Зачем вам нужна эта информация?

+4

Мое предположение, что он пытается избежать множественной подписки – PerlDev

0

Если вам нужен тест, если делегат существует/подписался, вы можете попробовать - = первый, в поймать перспективе + =

0

Вы можете сделать это только внутри класса, которому принадлежит обработчик события (Button в этом случае). В классе Button вы можете проверить для Click != null, чтобы узнать, есть ли подписчики. К сожалению, поскольку я подозреваю, что Button - это класс фреймворков, вам не повезло.

5

Я проверил тему, предложенную Norman H (Determine list of event handlers bound to event)

Он работал для меня в случае "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(); 
    } 

Возможные значения для именем_события в выходе это GetFields команда:

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

Таким образом, возможные значения:

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

Отлично! Правильное сочетание ... это работает. :) Спасибо. –