J'ai un formulaire avec un bouton "Effacer".VB.NET - Itérer par des contrôles dans un objet conteneur
Lorsque l'utilisateur clique sur "Effacer", je souhaite effacer la valeur de tous les éléments visibles sur le formulaire. Dans le cas des contrôles de date, je veux les réinitialiser à la date actuelle.
Toutes mes commandes sont contenues dans un Panel.
En ce moment, je le fais avec le code ci-dessous. Existe-t-il un moyen plus simple que de vérifier manuellement chaque type de contrôle? Cette méthode semble excessivement lourde. Pour empirer les choses, afin d'effacer les contrôles à l'intérieur des sous-conteneurs de manière récursive (c'est-à-dire une zone de groupe dans le panneau), je dois répéter le monstre entier avec une version "GroupBox" surchargée.
Editer: Grâce à vos suggestions, le code ci-dessous est grandement simplifié.
Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click
'User clicks Clear, so clear all the controls within this panel
ClearAllControls(panMid, True) 'True indicates that yes, i want to recurse through sub-containers
End Sub
ClearAllControls(ByRef container As Panel, Optional Recurse As Boolean = True)
'Clear all of the controls within the container object
'If "Recurse" is true, then also clear controls within any sub-containers
Dim ctrl As Control
For Each ctrl In container.Controls
If (ctrl.GetType() Is GetType(TextBox)) Then
Dim txt As TextBox = CType(ctrl, TextBox)
txt.Text = ""
End If
If (ctrl.GetType() Is GetType(CheckBox)) Then
Dim chkbx As CheckBox = CType(ctrl, CheckBox)
chkbx.Checked = False
End If
If (ctrl.GetType() Is GetType(ComboBox)) Then
Dim cbobx As ComboBox = CType(ctrl, ComboBox)
cbobx.SelectedIndex = -1
End If
If (ctrl.GetType() Is GetType(DateTimePicker)) Then
Dim dtp As DateTimePicker = CType(ctrl, DateTimePicker)
dtp.Value = Now()
End If
If Recurse Then
If (ctrl.GetType() Is GetType(Panel)) Then
Dim pnl As Panel = CType(ctrl, Panel)
ClearAllControls(pnl, Recurse)
End If
If ctrl.GetType() Is GetType(GroupBox) Then
Dim grbx As GroupBox = CType(ctrl, GroupBox)
ClearAllControls(grbx, Recurse)
End If
End If
Next
End Sub
@Theraccoonbear: J'aime votre suggestion, mais quand je change la déclaration à ceci:
Private Sub ClearAllControls(ByRef controls As ControlCollection, Optional ByVal Recurse As Boolean = True)
Ensuite, cette ligne me donne « Impossible de jeter l'objet de type 'ControlCollection' taper ' ControlCollection '. ":
ClearAllControls(panMid.Controls)
appel pour mehod: raz (Me.Controls) – user3692282
Essayez de ne pas afficher de code uniquement des solutions. – NathanOliver
ok, mais, je pense que c'est une solution pour la question ci-dessus, n'est ce pas? – user3692282