检测已选中的复选框的ID

时间:2014-01-17 16:32:07

标签: vb.net visual-studio-2010 windows-applications

我正在制作一个Windows窗体应用程序。我想检测用户正在选择哪个复选框。检查此方法的一种方法是每次触发复选框checkchanged事件时遍历所有控件。但我不想这样做,因为可以检查多个复选框。我希望在选中复选框时或在mousedown事件中获取复选框的ID。我怎么能这样做?

2 个答案:

答案 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