Przejrzyj wszystkie pola wyboru w formularzu [duplikat]
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
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ć Tag
z każdego CheckBox
w 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.