2014-01-17 2 views
0

Я делаю приложение в форме окна. Я хочу определить, какой флажок выбран пользователем. Одним из способов проверить это было бы циклическое перемещение всех элементов управления каждый раз при запуске флажка 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 
1

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

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) _ 
               Handles CheckBox1.CheckedChanged 
    'DirectCast(sender, CheckBox).Name ? 
End Sub 
+0

У меня есть небольшое сомнение, почему положение ручки содержит checkbox1.checked я имею в виду эта функция должна обрабатывать для всех флажков так, как эта функция будет вызываться, когда какой-либо другой флажок отмечен – user2179293

+0

@ user2179293: Это стандартный синтаксис, созданный Visual Studio, я сбросил CheckBox на форму и дважды щелкнул по ней. В вашем случае вы можете иметь несколько событий, обрабатываемых одним и тем же обработчиком событий, статическим или динамическим. У вас может быть или не быть статического предложения Handles - подход не меняется. Вам все равно нужно изучить аргумент 'sender'. – Neolisk

+0

В случае обработки нескольких флажков я должен перечислять имена всех флажков после дескриптора. У меня около 200 флажков – user2179293

Смежные вопросы