Przejrzyj wszystkie pola wyboru w formularzu [duplikat]

Nov 19 2020

Muszę przejrzeć wszystkie pola wyboru w formularzu i pobrać właściwość Tag dla każdego z nich. Pola wyboru znajdują się w polach grupowych i zagnieżdżonych polach grupowych. Kod, który mam, działa dla głównego formularza, nie pobiera wartości z pól wyboru w polach grupowych

...

            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

...

Odpowiedzi

1 jmcilhinney Nov 19 2020 at 23:46

Oto metoda, którą możesz dodać do formularza, która zapewnia dostęp do wszystkich kontrolek w formularzu za pośrednictwem kolejności tabulacji:

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

Ponieważ jest to iterator, możesz połączyć z nim inne metody LINQ. Aby uzyskać Tagz każdego CheckBoxw tablicy:

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

Jeśli chcesz użyć tej metody do wielu formularzy, zamiast powtarzać kod w każdym z nich, możesz dodać jedną metodę rozszerzenia:

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

a potem nazwij to w każdej formie, jakby był członkiem.