Parcourir toutes les cases à cocher d'un formulaire [dupliquer]

Nov 19 2020

J'ai besoin de parcourir toutes les cases à cocher d'un formulaire et d'obtenir la propriété Tag pour chacune. Les cases à cocher se trouvent dans des Groupboxes et des Groupboxes imbriquées. Le code que j'ai fonctionne pour le formulaire principal, il n'obtient pas les valeurs des cases à cocher dans les Groupboxes

...

            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

...

Réponses

1 jmcilhinney Nov 19 2020 at 23:46

Voici une méthode que vous pouvez ajouter à un formulaire qui donne accès à tous les contrôles du formulaire via l'ordre de tabulation:

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

Comme il s'agit d'un itérateur, vous pouvez y chaîner d'autres méthodes LINQ. Pour obtenir le Tagde chacun CheckBoxdans un tableau:

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

Si vous souhaitez utiliser cette méthode pour plusieurs formulaires, plutôt que de répéter le code dans chacun d'eux, vous pouvez ajouter une seule méthode d'extension:

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

puis appelez-le sous chaque forme comme s'il s'agissait d'un membre.