C# 在foreach中选择所有文本框并编辑它们。。不起作用

C# 在foreach中选择所有文本框并编辑它们。。不起作用,c#,winforms,foreach,textbox,try-catch,C#,Winforms,Foreach,Textbox,Try Catch,在我的winform中,我放置了一个按钮,我想用作重置按钮。按下该键,我的winform上所有文本框的文本应变为空,或者换句话说,textBox.text=“”; 我正在使用foreach语句,但它不起作用,因此我添加了一个try-catch,以查看是否存在任何异常错误。。try body中的语句和catch body中的语句都不执行。。谁能告诉我我做错了什么?提前谢谢 顺便说一句,我的winform有12个文本框。3个不同的分组框中各有4个 private void button2_Click

在我的winform中,我放置了一个按钮,我想用作重置按钮。按下该键,我的winform上所有文本框的文本应变为空,或者换句话说,textBox.text=“”; 我正在使用foreach语句,但它不起作用,因此我添加了一个try-catch,以查看是否存在任何异常错误。。try body中的语句和catch body中的语句都不执行。。谁能告诉我我做错了什么?提前谢谢

顺便说一句,我的winform有12个文本框。3个不同的分组框中各有4个

private void button2_Click(object sender, EventArgs e)
  {
     try
     {
        foreach (TextBox a in Controls.OfType<TextBox>())
        {
           a.Text = "";
        }
     }

     catch { MessageBox.Show("Error! Foreach failed"); }
  }
private void按钮2\u单击(对象发送者,事件参数e)
{
尝试
{
foreach(Controls.OfType()中的文本框a)
{
a、 Text=“”;
}
}
catch{MessageBox.Show(“错误!Foreach失败”);}
}
在这里也可以找到使用OfType()的
的其他示例,但要使用它,您还必须了解其功能。。

虽然我不能肯定地告诉你,但你似乎和父母有问题

父项可能是GroupBox1。 GroupBox1.Parent可能是Form1

因此,您真正需要的是检查Form1中每个控件的方法。控件包括:

private Control CheckForTextBox()
{
   foreach(control c in Controls)
   {
      if(c.HasChildren)
      {
        CheckForTextBox(c);
      }

      else if(c is TextBox)
      {
        ((TextBox)c).Text = "";
      }  
   }
}

问题在于这句话:

顺便说一句,我的winform有12个文本框。3个不同的分组框中各有4个

private void button2_Click(object sender, EventArgs e)
  {
     try
     {
        foreach (TextBox a in Controls.OfType<TextBox>())
        {
           a.Text = "";
        }
     }

     catch { MessageBox.Show("Error! Foreach failed"); }
  }
这意味着您的表单没有那些
TextBox
控件作为直接子控件。因此,使用
控件。of type
将不会返回任何项目。您可以通过在foreach中设置断点来确认这一点。您不会点击它(除非您没有告诉我们其他文本框)

有很多方法,最简单的方法是只嵌套您的foreach:

foreach (GroubBox g in Control.OfType<GroupBox>())
{
    foreach (TextBox a in g.Controls.OfType<TextBox>())
    {
       a.Text = "";
    }
}
foreach(GroubBox g在Control.OfType()中)
{
foreach(g.Controls.OfType()中的文本框a)
{
a、 Text=“”;
}
}
或者可以递归地搜索控制树。这具有在一般情况下工作的优点。讨论内容如下:

公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
公共无效ClearAllTextBox()
{
ForeachTextbox(这个,x=>x.Text=”“);
}
公共静态void ForeachTextbox(控件父项、操作)
{
如果(父项为文本框)
{
操作((文本框)父级);
}
foreach(父控件中的控件cntrl)
{
ForeachTextbox(cntrl,action);
}
}
}

与其他答案相同:您的代码将只获取父窗体中的文本框,而不是组框。 我认为这对于您的具体情况更为简洁,它将在所有GroupBox中搜索文本框。从功能上讲,这与BradleyDotNET的答案相同

try
{
    foreach (TextBox a in Controls.OfType<GroupBox>().SelectMany(x => x.Controls.OfType<TextBox>()))
    {
        a.Text = "";
    }
}

catch { MessageBox.Show("Error! Foreach failed"); }
试试看
{
foreach(Controls.OfType()中的文本框a。SelectMany(x=>x.Controls.OfType())
{
a、 Text=“”;
}
}
catch{MessageBox.Show(“错误!Foreach失败”);}

我会使用递归-类似于:

private void ResetText(Control Ctrl)
{
    foreach (Control a in Ctrl.Controls)
    {
        if (typeof(TextBox) == a.GetType())
        {
            ((TextBox)(a)).Text = "";
        }
        else
        {
            ResetText(a);
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        ResetText(this);
    }
    catch 
    {   
        MessageBox.Show("Error!"); 
    }
}

成功了。谢谢我对GroupBox了解不多。
try
{
    foreach (TextBox a in Controls.OfType<GroupBox>().SelectMany(x => x.Controls.OfType<TextBox>()))
    {
        a.Text = "";
    }
}

catch { MessageBox.Show("Error! Foreach failed"); }
private void ResetText(Control Ctrl)
{
    foreach (Control a in Ctrl.Controls)
    {
        if (typeof(TextBox) == a.GetType())
        {
            ((TextBox)(a)).Text = "";
        }
        else
        {
            ResetText(a);
        }
    }
}

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        ResetText(this);
    }
    catch 
    {   
        MessageBox.Show("Error!"); 
    }
}