обработчик событий для нескольких элементов управления vb.net

AM пытается перехватить определенные события для некоторых элементов управления в форме. Я пробовал это, но не запускал события

 For Each ctrl As Control In pnlGeneral.Controls
            If TypeOf ctrl Is CheckBox Then
                AddHandler (DirectCast(ctrl, CheckBox).CheckedChanged), AddressOf Control_Changed
            ElseIf TypeOf ctrl Is TextBox Then
                AddHandler (ctrl.TextChanged), AddressOf Control_Changed
            ElseIf TypeOf ctrl Is NumericUpDown Then
                AddHandler (DirectCast(ctrl, NumericUpDown).ValueChanged), AddressOf Control_Changed
            End If

        Next

Кто-нибудь может мне помочь с исправлением?

РЕДАКТИРОВАТЬ

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


person Smith    schedule 06.07.2011    source источник
comment
Где вы выполняете этот код?   -  person Daniel Hilgarth    schedule 06.07.2011
comment
Посмотрите в окно вывода. Вы видите исключение при первой возможности?   -  person Hans Passant    schedule 06.07.2011
comment
Просто, черт возьми, поместите этот код в событие Shown. Есть ли у всех этих событий одна и та же подпись?   -  person dbasnett    schedule 06.07.2011
comment
Ваш код работает - я его тестировал.   -  person LarsTech    schedule 06.07.2011
comment
@LarsTech вы тестировали с элементами управления NumericUpDown, Checkbox и textbox   -  person Smith    schedule 06.07.2011
comment
@dbasnett есть ли разница между помещением его в событие Form_load и show?   -  person Smith    schedule 06.07.2011
comment
@Smith Я создал панель под названием pnlGeneral, поместил на нее CheckBox, NumericUpDown и TextBox, скопировал ваш код в событие Form_Load, добавил ListBox сбоку, а затем в процедуре Control_Changed просто сделал ListBox1.Items.Add (sender.ToString), и он запускал все эти события изменения.   -  person LarsTech    schedule 06.07.2011
comment
@Smith См. Обновление моего исходного сообщения.   -  person dbasnett    schedule 06.07.2011
comment
@dbasnett тоже делает эту работу Me.GetNextControl(Me, True), я не знал, я не пробовал, потому что думал, что это мой ответ, который вы скопировали bac, тогда я отмечу его как ответ   -  person Smith    schedule 06.07.2011
comment
Если вы попробовали, и он работает, значит, работает. Нет, я не копировал ваш код.   -  person dbasnett    schedule 06.07.2011


Ответы (1)


Как сказал Ларс, похоже, что это работает.

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

Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    Dim ctrl As Control = Me.GetNextControl(Me, True)
    Do Until ctrl Is Nothing
        If TypeOf ctrl Is CheckBox Then
            AddHandler (DirectCast(ctrl, CheckBox).CheckedChanged), AddressOf Control_Changed
        ElseIf TypeOf ctrl Is TextBox Then
            AddHandler (ctrl.TextChanged), AddressOf Control_Changed
        ElseIf TypeOf ctrl Is NumericUpDown Then
            AddHandler (DirectCast(ctrl, NumericUpDown).ValueChanged), AddressOf Control_Changed
        End If
        ctrl = Me.GetNextControl(ctrl, True)
    Loop
End Sub

Private Sub Control_Changed(sender As System.Object, e As System.EventArgs)
    Debug.WriteLine(sender.ToString)
End Sub
person dbasnett    schedule 06.07.2011