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)

Ответы на вопрос(9)

Ваш ответ на вопрос