Durchlaufen Sie alle Kontrollkästchen in einem Formular [Duplikat].

Nov 19 2020

Ich muss alle Kontrollkästchen in einem Formular durchlaufen und die Tag-Eigenschaft für jedes abrufen. Die Kontrollkästchen befinden sich in Gruppenfeldern und verschachtelten Gruppenfeldern. Code, den ich habe, funktioniert für das Hauptformular. Es werden die Werte nicht aus den Kontrollkästchen in den Gruppenfeldern abgerufen

...

            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

...

Antworten

1 jmcilhinney Nov 19 2020 at 23:46

Hier ist eine Methode, die Sie einem Formular hinzufügen können, das über die Tabulatorreihenfolge Zugriff auf alle Steuerelemente im Formular bietet:

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

Da dies ein Iterator ist, können Sie andere LINQ-Methoden daran verketten. So bringen Sie das Tagvon jedem CheckBoxin ein Array:

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

Wenn Sie diese Methode für mehrere Formulare verwenden möchten, können Sie eine einzelne Erweiterungsmethode hinzufügen, anstatt den Code in jedem Formular zu wiederholen:

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

und nenne es dann in jeder Form, als wäre es ein Mitglied.