У меня есть форма с кнопкой «Очистить».VB.NET - Итерация через элементы управления в контейнерном объекте
Когда пользователь нажимает «Очистить», я хочу очистить значение всех видимых элементов формы. В случае элементов управления датой я хочу сбросить их до текущей даты.
Все мои элементы управления содержатся на панели.
Прямо сейчас, я делаю это с приведенным ниже кодом. Есть ли более простой способ, чем проверка вручную для каждого типа управления? Этот метод кажется чрезмерно громоздким.
Чтобы усугубить ситуацию, чтобы рекурсивно очистить элементы управления внутри субконтейнеров (т. Е. Групповой ящик внутри панели), я должен повторить весь монстр с перегруженной версией «GroupBox».
Редактировать: Благодаря вашим предложениям, приведенный ниже код значительно упрощен.
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: Мне нравится ваше предложение, но когда я изменить объявление к этому:
Private Sub ClearAllControls(ByRef controls As ControlCollection, Optional ByVal Recurse As Boolean = True)
Затем эта линия дает мне «Не удается привести объект типа„ControlCollection“к типу ' ControlCollection '. ":
ClearAllControls(panMid.Controls)
Призыв к mehod: raz (Me.Controls) – user3692282 2015-04-13 17:52:55