Я делаю приложение формы окна. Я хочу определить, какой флажок выбран пользователем. Один из способов проверить это — перебирать все элементы управления каждый раз, когда срабатывает событие флажка checkchanged
. Но я не хочу этого делать, потому что можно отметить несколько флажков. Я хочу получить идентификатор флажка, когда он выбран или в событии mousedown. Как я могу это сделать?
Обнаружение идентификатора флажка, который был отмечен
Ответы (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
У меня есть небольшое сомнение, почему предложение дескриптора содержит checkbox1.checked. Я имею в виду, что эта функция должна обрабатывать все флажки, поэтому как эта функция будет вызываться, когда установлен какой-либо другой флажок.
- person user2179293; 17.01.2014
@user2179293 user2179293: Это стандартный синтаксис, сгенерированный Visual Studio, я поместил флажок в форму и дважды щелкнул по нему. В вашем случае вы можете обрабатывать несколько событий одним и тем же обработчиком событий, статическим или динамическим. Вы можете иметь или не иметь статическое предложение Handles - подход не меняется. Вам все равно нужно будет изучить аргумент
sender
.
- person Neolisk; 17.01.2014
В случае обработки нескольких флажков мне нужно перечислить имена всех флажков после дескриптора. У меня около 200 флажков
- person user2179293; 17.01.2014
@ user2179293: Нет.
sender
будет флажком, который вы отметили.
- person Neolisk; 17.01.2014
@ user2179293 Вы можете программно добавить обработчик к каждому событию CheckedChanged CheckBox: оператор AddHandler а>. Выполнение этого для загрузки элементов управления: Обработка всех событий текстового поля в одном обработчике.
- person Andrew Morton; 17.01.2014
@ user2179293: Если вы еще этого не знаете, вы можете дополнительно вознаградить ответы, проголосовав за них. Типичная практика здесь, в StackOverflow, состоит в том, чтобы принимать и голосовать за наиболее полезные ответы. Помните, что вы можете голосовать за любое количество ответов, но только один из них может быть принят.
- person Neolisk; 18.01.2014