我想知道控件是否有Click事件分配的方法。檢查控制是否有事件點擊EventHandler
Button b = new Button();
b.Click += (sender, e) => { };
/* What I want */
b.Click.Count // 1
我需要的東西至少可以告訴我,如果控件有或沒有一些方法的點擊事件。
我想知道控件是否有Click事件分配的方法。檢查控制是否有事件點擊EventHandler
Button b = new Button();
b.Click += (sender, e) => { };
/* What I want */
b.Click.Count // 1
我需要的東西至少可以告訴我,如果控件有或沒有一些方法的點擊事件。
您可能會對此主題Determine list of event handlers bound to event做一些閱讀,看起來它可能與您嘗試執行的操作有些相關。
反思,我幾乎肯定這將是唯一的方法,我想我是對的......謝謝! – BrunoLM 2010-07-09 13:21:14
你不能那樣做。事件只是添加/刪除方法來添加委託給鏈。只有具有事件的類才能知道是否有事件的訂閱者。
更重要的是,您不需要知道是否有控制事件的訂閱者。你爲什麼需要這些信息?
我的猜測他試圖避免多次訂閱 – PerlDev 2010-07-09 13:02:02
如果您如果委託存在/訂閱需要測試,你可以嘗試 - =第一,在追趕跑+ =
你只能做到這一點從擁有在這種情況下,事件處理程序(Button
類中)。 在Button
課程內,您可以測試Click != null
以查看是否有用戶。不幸的是,因爲我懷疑Button
是框架類,所以你運氣不好。
我已經檢查由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();
}
爲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}
優秀!它的正確組合...它的作品。 :) 謝謝。 – 2017-09-27 15:39:32
你可能想在這裏看看:http://stackoverflow.com/questions/1246116/in-c-why-cant-i-test-if-a - 事件處理程序是空的任何地方 - 1246149#1246149 – 2010-07-09 12:55:08