3

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

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

     }

但是,它也会清除 a DomainUpDown,这又会发出警告,因为它的文本字段是空的,我该如何防止这种情况发生?

4

4 回答 4

2

小心,DomainUpDown是容器!

如果您想坚持使用大部分代码,请更改

else
    func(control.Controls);

else if (!(control is DomainUpDown))
    func(control.Controls);

您描述的行为的原因如下:DomainUpDownControl属性包含 - 以及其他东西 - a TextBox,因此您可能明确希望将其排除在与其他控件相同的处理方式之外;)

否则,您将对其进行递归,就好像它是一个Panel或类似的一样,因此也会清除其文本!

于 2013-09-20T09:13:49.710 回答
1

利用

if (control.GetType() == typeof(TextBox))

代替

如果(控件是文本框)

只清除文本框,并留下 DUD :)

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

MSDN:如果提供的表达式不为空,则 is 表达式的计算结果为 true,并且提供的对象可以转换为提供的类型而不会引发异常。

于 2013-09-20T09:27:16.880 回答
0

这将有助于清除文本框

 private void ClearInputs(ControlCollection ctrls)
        {
            foreach (Control ctrl in ctrls)
            {
                if (ctrl is TextBox)
                    ((TextBox)ctrl).Text = string.Empty;

                ClearInputs(ctrl.Controls);
            }
        }
于 2013-09-20T09:12:41.923 回答
-1

如果您只想清除文本框,您可以使用

foreach(var control in Controls.OfType<TextBox>())
{
    control.Clear();
}

如果您的方法是递归的,您可能更喜欢这个GetAll 方法

 foreach(var control in this.GetAll<TextBox>())
 foreach(var control in this.GetAll<TextBox>()
                            .Where(x => x.GetType().IsSubclassOf(typeof(TextBox))
于 2013-09-20T09:10:34.623 回答