Ich habe ein Formular mit einer Schaltfläche "Löschen".
Wenn der Benutzer auf "Löschen" klickt, möchte ich den Wert aller sichtbaren Elemente des Formulars löschen. Im Falle von Datumselementen möchte ich sie auf das aktuelle Datum zurücksetzen.
Alle meine Steuerelemente sind in einem Panel enthalten.
Im Moment mache ich das mit dem folgenden Code. Gibt es einen einfacheren Weg als die manuelle Überprüfung für jeden Kontrolltyp? Diese Methode scheint übermäßig unhandlich zu sein.
Um die Sache noch schlimmer zu machen, muss ich das ganze Monster mit einer überladenen "GroupBox"-Version wiederholen, um rekursiv Steuerelemente innerhalb von Sub-Containern zu löschen (z. B. einen Gruppenrahmen innerhalb des Panels).
Edit: Dank Ihrer Vorschläge wurde der folgende Code stark vereinfacht.
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: Ihr Vorschlag gefällt mir, aber wenn ich die Erklärung so ändere:
Private Sub ClearAllControls(ByRef controls As ControlCollection, Optional ByVal Recurse As Boolean = True)
Dann gibt diese Zeile mir "Unable to cast object of type 'ControlCollection' to type 'ControlCollection'.":
ClearAllControls(panMid.Controls)