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";
我使用以下代码以编程方式创建了 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";