Обнаружение идентификатора флажка, который был отмечен

Я делаю приложение формы окна. Я хочу определить, какой флажок выбран пользователем. Один из способов проверить это — перебирать все элементы управления каждый раз, когда срабатывает событие флажка checkchanged. Но я не хочу этого делать, потому что можно отметить несколько флажков. Я хочу получить идентификатор флажка, когда он выбран или в событии mousedown. Как я могу это сделать?


person user2179293    schedule 17.01.2014    source источник


Ответы (2)


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

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

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    For Each checkBox In Me.Controls.OfType(Of CheckBox)().Where(Function(cb As CheckBox) cb.Name.Contains("CheckBox"))
        AddHandler checkBox.CheckedChanged, AddressOf checkboxCheckedChanged
    Next
End Sub

Private Sub checkboxCheckedChanged(sender As Object, e As EventArgs)
    Dim myCheckbox As CheckBox = DirectCast(sender, CheckBox)
    Dim c As Boolean = myCheckbox.Checked
    Dim n As String = myCheckbox.Name
    ' etc.
End Sub

ИЗМЕНИТЬ

Как указал Neolisk, это не учитывает вложенные элементы управления, то есть элементы управления внутри контейнеров в форме. Этот метод расширения возвращает все эти элементы управления:

<Extension()> _
Public Function ChildControls(Of T As Control)(ByVal parent As Control) As List(Of T)
    Dim result As New List(Of Control)
    For Each ctrl As Control In parent.Controls
        If TypeOf ctrl Is T Then result.Add(ctrl)
        result.AddRange(ctrl.ChildControls(Of T)())
    Next
    Return result.ToArray().Select(Of T)(Function(arg1) CType(arg1, T)).ToList()
End Function

И вместо этого сделайте этот цикл в form_load:

    For Each checkBox In Me.ChildControls(Of CheckBox).Where(Function(cb As CheckBox) cb.Name.Contains("CheckBox"))
        AddHandler checkBox.CheckedChanged, AddressOf checkboxCheckedChanged
    Next
person djv    schedule 17.01.2014

Используйте аргумент sender в обработчике событий.

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) _
                                                 Handles CheckBox1.CheckedChanged
  'DirectCast(sender, CheckBox).Name ?
End Sub
person Neolisk    schedule 17.01.2014
comment
У меня есть небольшое сомнение, почему предложение дескриптора содержит checkbox1.checked. Я имею в виду, что эта функция должна обрабатывать все флажки, поэтому как эта функция будет вызываться, когда установлен какой-либо другой флажок. - person user2179293; 17.01.2014
comment
@user2179293 user2179293: Это стандартный синтаксис, сгенерированный Visual Studio, я поместил флажок в форму и дважды щелкнул по нему. В вашем случае вы можете обрабатывать несколько событий одним и тем же обработчиком событий, статическим или динамическим. Вы можете иметь или не иметь статическое предложение Handles - подход не меняется. Вам все равно нужно будет изучить аргумент sender. - person Neolisk; 17.01.2014
comment
В случае обработки нескольких флажков мне нужно перечислить имена всех флажков после дескриптора. У меня около 200 флажков - person user2179293; 17.01.2014
comment
@ user2179293: Нет. sender будет флажком, который вы отметили. - person Neolisk; 17.01.2014
comment
@ user2179293 Вы можете программно добавить обработчик к каждому событию CheckedChanged CheckBox: оператор AddHandler. Выполнение этого для загрузки элементов управления: Обработка всех событий текстового поля в одном обработчике. - person Andrew Morton; 17.01.2014
comment
@ user2179293: Если вы еще этого не знаете, вы можете дополнительно вознаградить ответы, проголосовав за них. Типичная практика здесь, в StackOverflow, состоит в том, чтобы принимать и голосовать за наиболее полезные ответы. Помните, что вы можете голосовать за любое количество ответов, но только один из них может быть принят. - person Neolisk; 18.01.2014