양식의 모든 확인란을 반복합니다.

Nov 19 2020

양식의 모든 확인란을 반복하고 각각에 대한 Tag 속성을 가져와야합니다. 체크 박스는 그룹 박스와 중첩 된 그룹 박스에 있습니다. 기본 양식에서 작동하는 코드는 그룹 상자의 확인란에서 값을 가져 오지 않습니다.

...

            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

...

답변

1 jmcilhinney Nov 19 2020 at 23:46

다음은 탭 순서를 통해 양식의 모든 컨트롤에 대한 액세스를 제공하는 양식에 추가 할 수있는 방법입니다.

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 메서드를 여기에 연결할 수 있습니다. Tag각각 CheckBox을 배열로 가져 오려면 :

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

회원 인 것처럼 각 형식으로 호출합니다.