Parcourir toutes les cases à cocher d'un formulaire [dupliquer]
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
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 Tag
de chacun CheckBox
dans 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.