我正在使用以下代码清除表单上的所有文本框
private void ClearTextBoxes()
{
Action<Control.ControlCollection> func = null;
func = (controls) =>
{
foreach (Control control in controls)
if (control is TextBox)
(control as TextBox).Clear();
else
func(control.Controls);
};
func(Controls);
}
但是,它也会清除DomainUpDown
,而{{1}}会发出警告,因为其文字字段为空,我该如何防止这种情况发生?
答案 0 :(得分:2)
小心,DomainUpDown
是一个容器!
如果您想坚持使用大部分代码,请更改
else
func(control.Controls);
到
else if (!(control is DomainUpDown))
func(control.Controls);
您描述的行为的原因如下:DomainUpDown
的{{1}}属性包含 - 以及其他内容 - Control
,因此您可能明确要将其排除在外处理方式与其他控件相同;)
否则你会像它是TextBox
或类似的那样递归它,因此也清除它的文字!
答案 1 :(得分:1)
使用
if(control.GetType()== typeof(TextBox))
而不是
if(control is TextBox)
只清除TextBox,然后离开DUD:)
MSDN:如果提供的表达式为非null,则表达式的计算结果为true,并且可以将提供的对象强制转换为提供的类型,而不会引发异常。
答案 2 :(得分:0)
这将有助于清除文本框
private void ClearInputs(ControlCollection ctrls)
{
foreach (Control ctrl in ctrls)
{
if (ctrl is TextBox)
((TextBox)ctrl).Text = string.Empty;
ClearInputs(ctrl.Controls);
}
}
答案 3 :(得分:-1)
如果您只想清除文本框,可以使用
foreach(var control in Controls.OfType<TextBox>())
{
control.Clear();
}
如果您的方法是递归的,您可能更喜欢这个GetAll method
foreach(var control in this.GetAll<TextBox>())
foreach(var control in this.GetAll<TextBox>()
.Where(x => x.GetType().IsSubclassOf(typeof(TextBox))