Найти все обработчики событий для элемента управления Windows Forms в .NET

Есть ли способ найти все обработчики событий дляWindows Forms контроль? Конкретно статически определенные обработчики событий?

Ответы на вопрос(3)

Этот код получит обработчики событий для элемента управления

Private Function getEventHandlers(ctrl As Control) As System.ComponentModel.EventHandlerList
    Dim value As System.ComponentModel.EventHandlerList = Nothing
    Try
        Dim propInfo As System.Reflection.PropertyInfo = GetType(Control).GetProperty("Events", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Static)
        If propInfo IsNot Nothing Then value = CType(propInfo.GetValue(ctrl), System.ComponentModel.EventHandlerList)
    Catch ex As Exception
    End Try
    Return value
End Function

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

Private Function hasEventHandler(ctrl As Control, Optional eventName As String = "Click") As Boolean
    Dim value As Boolean = False
    Try
        Dim handlerList As System.ComponentModel.EventHandlerList = getEventHandlers(ctrl)
        Dim controlEventInfo As System.Reflection.FieldInfo = GetType(Control).GetField("Event" + eventName, Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
        If controlEventInfo IsNot Nothing Then
            Dim eventKey As Object = controlEventInfo.GetValue(ctrl)
            Dim EventHandlerDelegate As [Delegate] = handlerList.Item(eventKey)
            If EventHandlerDelegate IsNot Nothing Then value = True
        End If
    Catch ex As Exception
    End Try
    Return value
End Function

EventHandlerList свойство называетсяEvents хранить обработчики событий, чтобы вы могли перебрать эту коллекцию. Чтобы определить, какие подписанные обработчики являются статическими, вам нужно будет использоватьотражение.

 Peter Mortensen09 сент. 2013 г., 18:15
Или "компоненты"?
 Peter Mortensen09 сент. 2013 г., 17:57
Разве вы не имеете в виду саму форму (не элементы управления)?
Решение Вопроса

нтов управления хранят ссылку на обработчик событий в списке, для которого требуется секретный файл cookie. Значение cookie создается динамически, вы не можете угадать его заранее. Reflection - это бэкдор, вы должны знать имя переменной cookie. Например, событие для Control.Click называется «EventClick», вы можете увидеть это в справочном источнике или в Reflector.

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

 Sami22 сент. 2012 г., 21:26
@ Ганс Пассант. У меня есть просьба ответить на аналогичный вопрос. Вы прокомментировали, но не ответили. Теперь я обновил вопрос. Пожалуйста, посмотрите наstackoverflow.com/questions/12174148/...«всякий раз, когда вы найдете время.
 Jeff04 окт. 2010 г., 16:47
«если ты чувствуешь, что делаешь что-то неразумное, значит ты на правильном пути». Я только начинал чувствовать это, когда получил твой ответ здесь. Благодарю. Определенно нужно переосмыслить, что я делаю и почему. Спасибо за помощь.

Ваш ответ на вопрос