2010-07-09 40 views
5

我想知道控件是否有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 - 事件處理程序是空的任何地方 - 1246149#1246149 – 2010-07-09 12:55:08

回答

3

您可能會對此主題Determine list of event handlers bound to event做一些閱讀,看起來它可能與您嘗試執行的操作有些相關。

+0

反思,我幾乎肯定這將是唯一的方法,我想我是對的......謝謝! – BrunoLM 2010-07-09 13:21:14

1

你不能那樣做。事件只是添加/刪除方法來添加委託給鏈。只有具有事件的類才能知道是否有事件的訂閱者。

更重要的是,您不需要知道是否有控制事件的訂閱者。你爲什麼需要這些信息?

+4

我的猜測他試圖避免多次訂閱 – PerlDev 2010-07-09 13:02:02

0

如果您如果委託存在/訂閱需要測試,你可以嘗試 - =第一,在追趕跑+ =

0

你只能做到這一點從擁有在這種情況下,事件處理程序(Button類中)。 在Button課程內,您可以測試Click != null以查看是否有用戶。不幸的是,因爲我懷疑Button是框架類,所以你運氣不好。

5

我已經檢查由Norman HDetermine 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(); 
    } 

eventName的可能值在輸出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

優秀!它的正確組合...它的作品。 :) 謝謝。 – 2017-09-27 15:39:32