C# 使用循环生成代码

C# 使用循环生成代码,c#,C#,我是C#编程新手。我在表单上有许多文本框,不必为每个文本框编写相同的代码,是否可以使用循环为每个文本框编写相同的代码?在下面的代码中,我们可以使用变量i进行相同的操作吗 private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 3; i++) { MessageBox.Show(amountTextBox.Text); MessageBox.Sho

我是
C#
编程新手。我在表单上有许多文本框,不必为每个文本框编写相同的代码,是否可以使用循环为每个文本框编写相同的代码?在下面的代码中,我们可以使用变量
i
进行相同的操作吗

private void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 3; i++)
    {
        MessageBox.Show(amountTextBox.Text);
        MessageBox.Show(amountTextBox1.Text);
        MessageBox.Show(amountTextBox2.Text);
        MessageBox.Show(amountTextBox3.Text);
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<3;i++)
{
MessageBox.Show(amountTextBox.Text);
MessageBox.Show(amountTextBox1.Text);
MessageBox.Show(amountTextBox2.Text);
MessageBox.Show(amountTextBox3.Text);
}
}

预先感谢。< /P> < P>而不是试图生成代码(这比它听起来更难),每当你有变量名为“代码>某个东西<1/代码>,<代码>某个2>代码>,…<代码>某个< <代码>时,你应该考虑使用一个数组,或者其他一些集合。p> 创建一个文本框数组,如下所示:

var amountTextBoxes = new[] { amountTextBox, amountTextBox1, amountTextBox2, amountTextBox3 };
for (int i = 0; i < amountTextBoxes.Length; i++)
{
    MessageBox.Show(amountTextBoxes[i].Text);
}
foreach (var textBox in amountTextBoxes)
{
    MessageBox.Show(textBox.Text);
}
然后像这样循环:

var amountTextBoxes = new[] { amountTextBox, amountTextBox1, amountTextBox2, amountTextBox3 };
for (int i = 0; i < amountTextBoxes.Length; i++)
{
    MessageBox.Show(amountTextBoxes[i].Text);
}
foreach (var textBox in amountTextBoxes)
{
    MessageBox.Show(textBox.Text);
}
在这种特定情况下,另一个可能有效的选项(尽管此解决方案不像前一个解决方案那样通用)涉及基于名称直接搜索控件。如果这是Windows窗体应用程序,则可以使用(假设所有控件都具有相同的名称模式):


你可以试试这样的

foreach (Control x in this.Controls)
{
  if (x is TextBox)
  {
    MessageBox.Show(((TextBox)x).Text);
   }
}
您的代码被重写:

    for (int i = 0; i < 3; i++)
    {
        MessageBox.Show(amountTextBox[i].Text);
    }
for(int i=0;i<3;i++)
{
MessageBox.Show(amountTextBox[i].Text);
}

您也可以这样做,而不是使用for循环。。 *注意*-这适用于表单中的所有文本框控件。。对于特定的文本框,可以使用for循环,该循环遍历所需的文本框数组或集合

foreach(Control control in this.Controls)

{

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

{
MessageBox.Show(control.Text);


}

}
具有扩展方法的更好版本:

foreach (TextBox x in this.Controls.OfType<TextBox>().OrderBy(x => x.Name))
{
     MessageBox.Show(x.Text);
}
foreach(此.Controls.OfType()中的文本框x.OrderBy(x=>x.Name))
{
MessageBox.Show(x.Text);
}

这是一个linq版本

this.Controls
   .OfType<TextBox>()
   .ToList()
   .ForEach(control => 
     MessageBox.Show(control.Text));
this.Controls
第()类
托利斯先生()
.ForEach(控件=>
Show(control.Text));

正如Selman22所提到的,您可以使用这个.Controls.OfType()来解决它。您可以进一步细化查询,如下所述

foreach (TextBox textBox in this.Controls.OfType<TextBox>().Where(x => x.Name.Contains("amountTextBox")).OrderBy(x => x.Name).ToList())
        {
            MessageBox.Show(textBox.Text);
        }
foreach(此.Controls.OfType()中的TextBox TextBox.Where(x=>x.Name.Contains(“amountTextBox”)).OrderBy(x=>x.Name.ToList())
{
MessageBox.Show(textBox.Text);
}

一种简单且可维护的方法是
按照您感兴趣的顺序返回您感兴趣的每个文本框,然后对其进行迭代

private void button1_Click(object sender, EventArgs e)
{
    foreach (var textBox in GetAmountTextBoxes())
        MessageBox.Show(textBox.Text);
}

private IEnumerable<TextBox> GetAmountTextBoxes()
{
    yield return amountTextBox;
    yield return amountTextBox1;
    yield return amountTextBox2;
    yield return amountTextBox3;
}
private void按钮1\u单击(对象发送者,事件参数e)
{
foreach(getAmountTextBox()中的var textBox)
MessageBox.Show(textBox.Text);
}
私有IEnumerable GetAmountTextBox()
{
收益返回金额文本框;
收益回报金额textbox1;
收益回报金额textbox2;
收益回报金额textbox3;
}
如果您有许多文本框,并且维护此列表很麻烦,您可以将其概括为:

return Controls.OfType<TextBox>();
返回控件。of type();
但是,如果需要的话,请注意将其过滤为只使用
Where
所需的文本框控件


如果顺序很重要,您需要设计一些函数来对文本框进行排序(与
OrderBy
结合使用)。这是必要的,因为默认排序算法将在
TextBox1
之前对
TextBox10
进行排序。这是一个很好的解决方案,适用于任何数量的文本框,这些文本框可以实际出现在表单上。对于不切实际的数字,您可以执行类似于
foreach(Controls.OfType().OrderBy(t=>t.Name)){…}
@ta.speot.is的操作,前提是您希望对
控件中的所有文本框执行相同的操作。也可以按名称筛选它们。现在它们可以以任何顺序出现。你对Enumerable.OfType有什么反对意见?私有的void按钮点击(objectsender,EventArgs e){for(inti=0;i<3;i++){MessageBox.Show(amountTextBox[i].Text);}我发布的是循环中正确的主体!现在这个问题也被纠正了!
amountTextBox
来自哪里?在问题中,它显然是一个
文本框
。它没有索引器。这适用于表单中的所有textbox控件,也不考虑顺序。测试人员刚刚提交了一份错误报告:第四个数量显示在第一个之前。排除原因。@ta.speot.is然后我们可以使用
OrderBy
?它将按照
Name
进行词汇排序。我相信
TextBox100
会出现在
TextBox1
之前,如果他有100个相同形式的文本框!要解决这个问题,他/她可以编写自己的比较器。我需要一些睡眠:DIt会在
TextBox1
之前显示
TextBox10
。10文本框控件是否太多?如果
amountTextBox3.Name
a
amountTextBox.Name
z
,该怎么办?现在,第四个金额出现在第一个金额之前。如果
amountTextBox3
amountTextBox
之前的
控件中,该怎么办?现在,第四个金额出现在第一个金额之前。