清除所有TextBox但忽略DomainUpDown

时间:2013-09-20 09:04:17

标签: c# visual-studio-2010

我正在使用以下代码清除表单上的所有文本框

 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}}会发出警告,因为其文字字段为空,我该如何防止这种情况发生?

4 个答案:

答案 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:)

'is'运算符不检查参数的类型,但检查它们是否兼容(与继承有关),并且通常用于检查接口。

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))