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