Проверьте, есть ли у элемента управления события Click EventHandler - PullRequest
5 голосов
/ 09 июля 2010

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 05 февраля 2015

Я проверил тему, предложенную Norman H ( Определить список обработчиков событий, связанных с событием )

У меня сработало в случае " 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}
3 голосов
/ 09 июля 2010

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

1 голос
/ 09 июля 2010

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

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

0 голосов
/ 09 июля 2010

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

0 голосов
/ 09 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...