我确实记得有人在前一段时间看到有人问过这些问题,但我做了一次搜索而找不到任何东西。
我正在尝试用最干净的方法将表单上的所有控件清除回默认值(例如,清除文本框,取消选中复选框)。
你会怎么做?
答案 0 :(得分:17)
到目前为止我想出的是这样的:
public static class extenstions
{
private static Dictionary<Type, Action<Control>> controldefaults = new Dictionary<Type, Action<Control>>() {
{typeof(TextBox), c => ((TextBox)c).Clear()},
{typeof(CheckBox), c => ((CheckBox)c).Checked = false},
{typeof(ListBox), c => ((ListBox)c).Items.Clear()},
{typeof(RadioButton), c => ((RadioButton)c).Checked = false},
{typeof(GroupBox), c => ((GroupBox)c).Controls.ClearControls()},
{typeof(Panel), c => ((Panel)c).Controls.ClearControls()}
};
private static void FindAndInvoke(Type type, Control control)
{
if (controldefaults.ContainsKey(type)) {
controldefaults[type].Invoke(control);
}
}
public static void ClearControls(this Control.ControlCollection controls)
{
foreach (Control control in controls)
{
FindAndInvoke(control.GetType(), control);
}
}
public static void ClearControls<T>(this Control.ControlCollection controls) where T : class
{
if (!controldefaults.ContainsKey(typeof(T))) return;
foreach (Control control in controls)
{
if (control.GetType().Equals(typeof(T)))
{
FindAndInvoke(typeof(T), control);
}
}
}
}
现在你可以像这样调用扩展方法ClearControls:
private void button1_Click(object sender, EventArgs e)
{
this.Controls.ClearControls();
}
编辑:我刚刚添加了一个通用的ClearControls方法,它将清除该类型的所有控件,可以这样调用:
this.Controls.ClearControls<TextBox>();
目前它只处理顶级控件,不会深入挖掘组框和面板。
答案 1 :(得分:3)
我知道这是一个老问题,但只是我的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;
}
}
}
}
}
我从这样的任何形式调用方法,将表单对象作为参数传递。
Helper.ClearFormControls(this);
您可以将其扩展为其他类型的控件。你只需要施展它。
答案 2 :(得分:2)
你可以循环控制
foreach (Control ctrl in this)
{
if(ctrl is TextBox)
(ctrl as TextBox).Clear();
}
答案 3 :(得分:2)
我投票赞成了Nathan的解决方案,但希望增加一点评论可以处理。
他实际上非常好,但我认为最好的解决方案是在将每个控件类型添加到GUI之前对其进行子类化。让他们都实现一个“可清除”或类似的接口(我是一个java程序员,但概念应该在那里),然后迭代它作为“可清除”对象的集合,调用唯一的方法.clear()在每个
这就是在OO系统中真正应该完成GUI的方式。这将使你的代码在未来很容易扩展 - 几乎太容易了,你会感到震惊。
编辑:(根据Nathan关于不改变现有控制的评论)
也许你可以创建引用你的控件的“容器”类(每种控件类型一个)。在您在答案中设置的循环中,您可以实例化正确的容器,将实际控件放在容器中并将容器存储在集合中。
这样你就可以回过头去迭代一个集合了。
这将是一个很好的简单解决方案,并不比你建议的那么复杂,但可扩展性更强。
答案 4 :(得分:2)
上述解决方案似乎忽略了嵌套控件。
可能需要递归函数,例如:
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所建议的),会减少这个函数的长度,但需要对每个控件进行更多的工作。
答案 5 :(得分:2)
这是我在第一个答案中提出的相同的东西,但在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
<Runtime.CompilerServices.Extension()> _
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中做同样的事情。
答案 6 :(得分:1)
private void FormReset() { ViewState.Clear(); 的Response.Redirect(Request.Url.AbsoluteUri.ToString()); }
答案 7 :(得分:0)
以下是我用来从实现ITextBox的类型控件中清除文本的方法。
我注意到在示例中设置了默认的布尔值。我相信你可以修改它来设置布尔组件的默认值。
将Clear方法传递给控件类型(TextBox,Label ...等)和控件集合,它将清除实现ITextBox的控件中的所有文本。
这样的事情:
//Clears the textboxes
WebControlUtilities.ClearControls<TextBox>(myPanel.Controls);
Clear方法适用于页面或母版页。控件集合类型可能有所不同。即。 Form,ContentPlaceHolder .. etc
/// <summary>
/// Clears Text from Controls...ie TextBox, Label, anything that implements ITextBox
/// </summary>
/// <typeparam name="T">Collection Type, ie. ContentPlaceHolder..</typeparam>
/// <typeparam name="C">ie TextBox, Label, anything that implements ITextBox</typeparam>
/// <param name="controls"></param>
public static void Clear<T, C>(ControlCollection controls)
where C : ITextControl
where T : Control
{
IEnumerable<T> placeHolders = controls.OfType<T>();
List<T> holders = placeHolders.ToList();
foreach (T holder in holders)
{
IEnumerable<C> enumBoxes = holder.Controls.OfType<C>();
List<C> boxes = enumBoxes.ToList();
foreach (C box in boxes)
{
box.Text = string.Empty;
}
}
}
/// <summary>
/// Clears the text from control.
/// </summary>
/// <typeparam name="C"></typeparam>
/// <param name="controls">The controls.</param>
public static void ClearControls<C>(ControlCollection controls) where C : ITextControl
{
IEnumerable<C> enumBoxes = controls.OfType<C>();
List<C> boxes = enumBoxes.ToList();
foreach (C box in boxes)
{
box.Text = string.Empty;
}
}