如何清除表单中所有文本框的文本?

22
private void CleanForm()
{
    foreach (var c in this.Controls)
    {
        if (c is TextBox)
        {
            ((TextBox)c).Text = String.Empty;
        }
    }
}

上述方法不起作用,控件没有被清除。它可以编译成功,但没有任何效果。

有什么想法吗?


2
顺便提一下,您可能想指定 TextBoxBase 而不是 TextBox;这将自动包括多行文本框、富文本框等。 - Timwi
1
另外,您不需要强制转换为“TextBox”。 - SLaks
这段代码可以正常工作,但请确保在 for each 语句中,(this.Controls) 就是包含文本框的实际控件。例如,如果你有一个表单,其中有一个 tableLayoutPanel,并且所有文本框都在 tableLayoutPanel 中,则 foreach(var c in this.Controls) 将无法使用,必须使用 foreach(var c in tableLayoutPanel1.Controls)。 - Hammy
10个回答

69

我喜欢 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版本是什么? - Homam
它无法识别“func(Controls)”中的“Controls”!有任何想法如何在.NET 4.7中解决这个问题吗? - f4d0
我们如何在 WPF 中实现它? - Ahmad

6
我们几周前曾遇到过类似的问题。如果您设置断点并深入查看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。 - Spero

4
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'就是Page)。


3

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

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

3

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

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


它们在GroupBoxes内部。最好的行动方案是什么? - delete
@sergio:你需要将你的函数改为递归函数。 - SLaks

2

这段代码可以清除表单中所有控件的内容,如文本框、复选框和单选按钮。

您可以添加您想要的不同类型。

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

1
看起来很不错,但如何实现呢? - f4d0
@Nuno,只有你需要调用方法form is submitted或saved,并传递控制对象。 - Chandan Pasunoori
点击按钮后,我们如何调用这个函数? - Jansen Malaggay

2
也许您想要更简单、更短的方法。这将同时清除所有文本框(除了面板或分组框中的文本框)。
 foreach (TextBox textBox in Controls.OfType<TextBox>())
    textBox.Text = "";

1

由于这里的回答都没有帮到我,所以我将发布对我有用的解决方案。

当您在组合框中有文本框时,无法使用基本的this.Control操作。

您需要创建一个双重foreach循环序列,循环进入每个组合框查找文本框。

尝试使用以下代码:

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

0

试试这个:

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

无法工作,我收到以下消息:“错误CS0120需要对象引用才能访问非静态字段、方法或属性'Control.Controls'”。 - f4d0

0
你可以尝试这段代码。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {


        if(keyData==Keys.C)
        {
            RefreshControl();
            return true;
        }


        return base.ProcessCmdKey(ref msg, keyData);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接