清除C#表单上所有控件的最佳方法是什么?

我确实记得有人在前一段时间看到有人问过这些问题,但是我做了搜索而找不到任何东西。

我正在尝试用最干净的方法将表单上的所有控件清除回默认值(例如,清除文本框,取消选中复选框)。

你会怎么做?

我知道这是一个老问题,但只是我的2美分。这是我用于表格清理的帮助类。

 using System; using System.Windows.Forms; namespace FormClearing { class Helper { public static void ClearFormControls(Form form) { foreach (Control control in form.Controls) { if (control is TextBox) { TextBox txtbox = (TextBox)control; txtbox.Text = string.Empty; } else if(control is CheckBox) { CheckBox chkbox = (CheckBox)control; chkbox.Checked = false; } else if (control is RadioButton) { RadioButton rdbtn = (RadioButton)control; rdbtn.Checked = false; } else if (control is DateTimePicker) { DateTimePicker dtp = (DateTimePicker)control; dtp.Value = DateTime.Now; } } } } } 

我从任何forms调用方法,将表单对象作为参数传递。

 Helper.ClearFormControls(this); 

您可以将其扩展为其他类型的控件。 你只需要施展它。

你可以循环控制

 foreach (Control ctrl in this) { if(ctrl is TextBox) (ctrl as TextBox).Clear(); } 

我投票赞成了Nathan的解决方案,但想补充一点,而不是评论可以处理。

他实际上非常好,但我认为最好的解决方案是在将每个控件类型添加到GUI之前对其进行子类化。 让他们都实现一个“可清除”或类似的接口(我是一个java程序员,但概念应该在那里),然后迭代它作为“可清除”对象的集合,调用唯一的方法.clear()在每一个上

这就是如何在OO系统中完成GUI。 这将使您的代码在将来易于扩展 – 几乎太容易了,您会感到震惊。

编辑:(根据内森关于不改变现有控制的评论)

也许你可以创建引用你的控件的“容器”类(每种类型的控件一个)。 在您在答案中设置的循环中,您可以实例化正确的容器,将实际控件放在容器中并将容器存储在集合中。

这样你就可以重新迭代一个集合了。

这将是一个很好的简单解决方案,并不比您建议的解决方案复杂得多,但可扩展性更高。

上述解决方案似乎忽略了嵌套控件。

可能需要递归函数,例如:

 public void ClearControl(Control control) { TextBox tb = control as TextBox; if (tb != null) { tb.Text = String.Empty; } // repeat for combobox, listbox, checkbox and any other controls you want to clear if (control.HasChildren) { foreach(Control child in control.Controls) { ClearControl(child) } } } 

您不希望在不检查控件类型的情况下清除Text属性。

在一组派生控件上实现诸如IClearable(如Bill K所建议)之类的接口将减少该函数的长度,但需要对每个控件进行更多的工作。

这是我在第一个答案中提出的相同的东西,但是在VB中,直到我们得到VB10,这是我们在VB中可以做的最好的,因为它不支持lambda中的非返回函数:

VB解决方案:

 Public Module Extension Private Sub ClearTextBox(ByVal T As TextBox) T.Clear() End Sub Private Sub ClearCheckBox(ByVal T As CheckBox) T.Checked = False End Sub Private Sub ClearListBox(ByVal T As ListBox) T.Items.Clear() End Sub Private Sub ClearGroupbox(ByVal T As GroupBox) T.Controls.ClearControls() End Sub  _ Public Sub ClearControls(ByVal Controls As ControlCollection) For Each Control In Controls If ControlDefaults.ContainsKey(Control.GetType()) Then ControlDefaults(Control.GetType()).Invoke(Control) End If Next End Sub Private _ControlDefaults As Dictionary(Of Type, Action(Of Control)) Private ReadOnly Property ControlDefaults() As Dictionary(Of Type, Action(Of Control)) Get If (_ControlDefaults Is Nothing) Then _ControlDefaults = New Dictionary(Of Type, Action(Of Control)) _ControlDefaults.Add(GetType(TextBox), AddressOf ClearTextBox) _ControlDefaults.Add(GetType(CheckBox), AddressOf ClearCheckBox) _ControlDefaults.Add(GetType(ListBox), AddressOf ClearListBox) _ControlDefaults.Add(GetType(GroupBox), AddressOf ClearGroupbox) End If Return _ControlDefaults End Get End Property End Module 

呼叫:

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Controls.ClearControls() End Sub 

我只是在这里发布这个,以便人们可以看到如何在VB中做同样的事情。

private void FormReset(){ViewState.Clear(); 的Response.Redirect(Request.Url.AbsoluteUri.ToString()); }

下面是我用来清除实现ITextBox的控件类型的文本的方法。

我注意到在示例中设置了默认的布尔值。 我相信你可以修改它来设置布尔组件的默认值。

将Clear方法传递给控件类型(TextBox,Label …等)和控件集合,它将清除实现ITextBox的控件中的所有文本。

像这样的东西:

 //Clears the textboxes WebControlUtilities.ClearControls(myPanel.Controls); 

Clear方法适用于页面或母版页。 控件集合类型可能有所不同。 即。 Form,ContentPlaceHolder等

  ///  /// Clears Text from Controls...ie TextBox, Label, anything that implements ITextBox ///  /// Collection Type, ie. ContentPlaceHolder.. /// ie TextBox, Label, anything that implements ITextBox ///  public static void Clear(ControlCollection controls) where C : ITextControl where T : Control { IEnumerable placeHolders = controls.OfType(); List holders = placeHolders.ToList(); foreach (T holder in holders) { IEnumerable enumBoxes = holder.Controls.OfType(); List boxes = enumBoxes.ToList(); foreach (C box in boxes) { box.Text = string.Empty; } } } ///  /// Clears the text from control. ///  ///  /// The controls. public static void ClearControls(ControlCollection controls) where C : ITextControl { IEnumerable enumBoxes = controls.OfType(); List boxes = enumBoxes.ToList(); foreach (C box in boxes) { box.Text = string.Empty; } }