【问题标题】:How to clear the text of all textBoxes in the form?如何清除表单中所有文本框的文本?
【发布时间】:2011-01-26 23:13:41
【问题描述】:
private void CleanForm()
{
    foreach (var c in this.Controls)
    {
        if (c is TextBox)
        {
            ((TextBox)c).Text = String.Empty;
        }
    }
}

上面的这个方法不起作用,控件没有被清除。它编译得很好,但什么也不做。

有什么想法吗?

【问题讨论】:

  • 顺便说一句,您可能希望指定TextBoxBase 而不是TextBox;这也会自动包含多行文本框、富文本框等。
  • 另外,您不需要转换为TextBox
  • 此代码按原样工作,但请确保在 for each 语句中,(this.Controls) 是具有文本框的实际控件,例如,如果您有一个带有tableLayoutPanel,文本框都在tableLayoutPanel中,foreach(var c in this.Controls)不行,必须foreach(var c in tableLayoutPanel1.Controls)。

标签: c# winforms textbox


【解决方案1】:

我喜欢 lambda :)

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

祝你好运!

【讨论】:

  • @Alexbelek,你用的是什么版本的 dot net?
  • 无法识别“func(Controls)”中的“Controls”!!知道如何在 .NET 4.7 中解决这个问题
  • 我们如何在 WPF 中做到这一点?
【解决方案2】:

几周前我们遇到过这样的问题。如果您设置断点并深入查看this.Controls,问题就会暴露其本质:您必须递归所有子控件。

代码可能如下所示:

private void CleanForm()
{
    traverseControlsAndSetTextEmpty(this);
}
private void traverseControlsAndSetTextEmpty(Control control)
{

    foreach(var c in control.Controls)
    {
        if (c is TextBox) ((TextBox)c).Text = String.Empty;
        traverseControlsAndSetTextEmpty(c);
    }
}

【讨论】:

  • 无法从对象转换为 System.WIndows.Forms.Control
【解决方案3】:
private void CleanForm(Control ctrl)
{
    foreach (var c in ctrl.Controls)
    {
        if (c is TextBox)
        {
            ((TextBox)c).Text = String.Empty;
        }

        if( c.Controls.Count > 0)
        {
           CleanForm(c);
        }
    }
}

当您最初调用 ClearForm 时,传入 this 或 Page(我假设这就是 'this')。

【讨论】:

    【解决方案4】:

    您的文本框可能位于面板或其他容器内,而不是直接位于表单内。

    你需要递归遍历每个子控件的Controls集合。

    【讨论】:

    • 它们在 GroupBoxes 中。最好的行动方案是什么?
    • @sergio:你需要让你的函数递归。
    【解决方案5】:

    我改进/修复了我的扩展方法。

    public  static class ControlsExtensions
    {
        public static void ClearControls(this Control frm)
        {
            foreach (Control control in frm.Controls)
            {
                if (control is TextBox)
                {
                    control.ResetText();
                }
    
                if (control.Controls.Count > 0)
                {
                    control.ClearControls();
                }
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      这用于清除文本框、复选框、单选按钮等表单中的所有控件

      你可以添加你想要的不同类型..

      private void ClearTextBoxes(Control control)
          {
              foreach (Control c in control.Controls)
              {
                  if (c is TextBox)
                  {
                      ((TextBox)c).Clear();
                  }
      
                  if (c.HasChildren)
                  {
                      ClearTextBoxes(c);
                  }
      
      
                  if (c is CheckBox)
                  {
      
                      ((CheckBox)c).Checked = false;
                  }
      
                  if (c is RadioButton)
                  {
                      ((RadioButton)c).Checked = false;
                  }
              }
          }
      

      【讨论】:

      • 看起来不错,但是如何实现呢?
      • @Nuno 只有你需要调用方法表单提交或保存传递控制对象
      • 是的,点击按钮后如何调用这个函数?
      【解决方案7】:

      也许您想要更简单、更简短的方法。这也将清除所有文本框。 (Panel 或 GroupBox 内的 TextBoxes 除外)。

       foreach (TextBox textBox in Controls.OfType<TextBox>())
          textBox.Text = "";
      

      【讨论】:

        【解决方案8】:

        由于这里没有任何答案对我有帮助,因此我发布了对我有用的解决方案。

        这适用于您在组框中有文本框的情况,因此您无法使用基本的this.Control 进行操作

        您将需要创建一个双 foreach 序列,循环到每个组框以查找文本框。

        试试这个:

        public void CleanTxTBoxes()
            {
                foreach (var groupbox in this.Controls.OfType<GroupBox>())
                {
                    foreach (var textboxitem in groupbox.Controls.OfType<TextBox>())
                    {
                        textboxitem.Clear();
                    }
                }
            }
        

        【讨论】:

          【解决方案9】:

          你可以试试这个代码

          protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
              {
          
          
                  if(keyData==Keys.C)
                  {
                      RefreshControl();
                      return true;
                  }
          
          
                  return base.ProcessCmdKey(ref msg, keyData);
              }
          

          【讨论】:

            【解决方案10】:

            试试这个:

            var t = this.Controls.OfType<TextBox>().AsEnumerable<TextBox>();
            foreach (TextBox item in t)
            {
                item.Text = "";
            }
            

            【讨论】:

            • 不工作,我收到以下消息:“错误 CS0120 非静态字段、方法或属性 'Control.Controls' 需要对象引用”
            猜你喜欢
            • 1970-01-01
            • 2014-06-08
            • 1970-01-01
            • 2017-04-30
            • 1970-01-01
            • 2013-02-27
            • 1970-01-01
            • 2012-10-24
            • 1970-01-01
            相关资源
            最近更新 更多