我正在制作一个Windows窗体应用程序。我想检测用户正在选择哪个复选框。检查此方法的一种方法是每次触发复选框checkchanged
事件时遍历所有控件。但我不想这样做,因为可以检查多个复选框。我希望在选中复选框时或在mousedown事件中获取复选框的ID。我怎么能这样做?
答案 0 :(得分: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 :(得分:1)
在事件处理程序中使用sender
参数。
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) _
Handles CheckBox1.CheckedChanged
'DirectCast(sender, CheckBox).Name ?
End Sub