【问题标题】:Clear all TextBoxes but ignore DomainUpDown清除所有文本框但忽略 DomainUpDown
【发布时间】:2013-09-20 17:44:18
【问题描述】:

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

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

【问题讨论】:

标签: c# visual-studio-2010


【解决方案1】:

小心,DomainUpDown 是一个容器!

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

else
    func(control.Controls);

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

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

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

【讨论】:

  • 感谢 olydis 效果很好 :) 我从来没有投反对票...我还不能投票:/
【解决方案2】:

使用

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

而不是

如果(控件是文本框)

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

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

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

【讨论】:

  • 你试过了吗?我刚测试过。 control.GetType() 将返回控件的实际类型。这不可能是TextBox。如果不确定,请使用 control.GetType().Name
  • 更正它不是 - 但是当他在Controls 上递归时,他也会在DomainUpDown 上递归;)你的代码没有问题,它只是不能解决他的问题
  • 是的,我明白了。有人可以解释为什么当我在我的沙箱中尝试它时它会起作用吗?
  • 因为你没有在你的沙盒中递归Controls
  • 没有?使用问题中的代码。你试过了吗,或者你只是对我的回答投了反对票。因为它可以在我的机器上运行。
【解决方案3】:

这将有助于清除文本框

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

                ClearInputs(ctrl.Controls);
            }
        }

【讨论】:

  • 什么是域名向上向下
【解决方案4】:

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

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

【讨论】:

  • 确实——我猜你也在清除DomainUpDown——这在语义上与他已经拥有的相同;)
  • @olydis - 我查过,DomainUpDown 与文本框没有任何关系,所以不,不会是
  • 是的...DomainUpDownControl 属性确实 包含TextBox - DomainUpDown 的文本所在的文本框;)我也检查过了;)
  • 非常!不要把它当成个人什么的,它只是没有解决他之前的问题:)
  • 等等,它仍然没有...GetAll 仍然会返回内部TextBox...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2013-02-27
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
相关资源
最近更新 更多