遍历表单上的所有复选框

Loop through all Checkboxes on a form

我需要遍历表单上的所有复选框并为每个复选框获取标签 属性。复选框位于组框和嵌套组框中。我的代码适用于主窗体,它没有从组框中的复选框中获取值

...

            i = 0

            For Each ctrl As Control In Me.Controls

                If (TypeOf ctrl Is CheckBox) Then

                    'Resize array
                    ReDim Preserve g_str_Array(i)

                    'Add Tag to array
                    g_str_Array(i) = CStr(ctrl.Tag)

                    i += 1

                End If

            Next

...

这是一种可以添加到表单的方法,该方法通过 Tab 键顺序提供对表单上每个控件的访问:

Public Iterator Function GetControls() As IEnumerable(Of Control)
    Dim ctrl = GetNextControl(Me, True)

    Do Until ctrl Is Nothing
        Yield ctrl

        ctrl = GetNextControl(ctrl, True)
    Loop
End Function

因为它是一个迭代器,所以您可以将其他 LINQ 方法链接到它。要将每个 CheckBoxTag 放入数组中:

Dim checkBoxTags = GetControls().OfType(Of CheckBox)().
                                 Select(Function(cb) CStr(cb.Tag)).
                                 ToArray()

如果您想将此方法用于多个表单,则无需在每个表单中重复代码,您可以添加一个扩展方法:

Imports System.Runtime.CompilerServices

Public Module FormExtensions

    <Extension>
    Public Iterator Function GetControls(source As Form) As IEnumerable(Of Control)
        Dim ctrl = source.GetNextControl(source, True)

        Do Until ctrl Is Nothing
            Yield ctrl

            ctrl = source.GetNextControl(ctrl, True)
        Loop
    End Function

End Module

然后在每个表单中都将其称为成员。