Windows Form C# - 如何使用以编程方式创建的文本框?

Windows Form C# - How can I use textBoxes created programmatically?

我使用以下代码以编程方式创建了 100 个文本框:

for (int c = 0; c < 100; c++)
{
    TextBox tb = new TextBox();
    tb.Text = "ADI" + i;
    tb.Click += new EventHandler(b_Click);
    Point p = new Point(20, 30 * i);
    tb.Location = p;
    this.panel1.Controls.Add(tb);
    i++;
}

现在我想retrieve/add一些数据给他们。
示例:

textBox1.Text = "a";

但是程序无法识别textBox1,因为它实际上不存在。
我该如何解决?

WinForms 设计器和您使用部分 classes。您在 class 的一部分工作。设计师在另一个。在编译的时候,你们各自写的东西放在一起。设计师创建的代码是运行 调用InitializeComponents(). 因此,设计师可以做你做不到的事。它还会创建内容 "Dynamic at runtime".

在这种情况下,解决方案相当简单 - 在创建这些 Box 时存储对它们的引用:

//class scope variable
TextBox[] createdBoxes = new TextBox[100];

//wichever function you run that in
for (int c = 0; c < 100; c++)
{
    TextBox tb = new TextBox();
    //Position code omited for readability
    createdBoxes[c] = tb;
}

但是有一个警告:不要在 GUI classes 中存储信息。使用您创建的文本框数组来存储数据是一个相当常见的错误。这只会使检索和重新设置数据变得异常困难。考虑将数据存储在代码隐藏中,使 GUI class 仅是游戏状态的 表示

还有那么多文本框,您可能深陷XY Problem territory

您可以为每个文本框指定名称。例如,

 TextBox tb = new TextBox();
 tb.Name = $"textBox{i}";

当您需要为特定的文本框赋值时,您可以使用 Linq 来搜索特定的控件。例如,

panel1.Controls.OfType<TextBox>().Single(x => x.Name == "textBox1").Text = "New Value";