[英]Get text of dynamically generated TextBox controls?
for(int i = 0; i < numberOfFields; i++)
{
TextBox generatedField = new TextBox();
generatedField.Text = "Please enter Field Report ID Here";
generatedField.Width = 176;
generatedField.Location = new Point(pointX, pointY);
panel1.Controls.Add(generatedField);
panel1.Show();
pointY += 25;
}
After generating the TextBoxes, how can I find out what was typed into them? 生成文本框后,如何找出键入的内容?
You need to set Name
of your controls, then you can access them by name this way: 您需要设置控件的
Name
,然后可以通过以下方式按名称访问它们:
Create controls and assign Name: 创建控件并分配名称:
for(int i = 0; i < numberOfFields; i++)
{
TextBox generatedField = new TextBox();
generatedField.Name = "someName_" + i.ToString();
generatedField.Text = "Please enter Field Report ID Here";
generatedField.Width = 176;
generatedField.Location = new Point(pointX, pointY);
panel1.Controls.Add(generatedField);
panel1.Show();
pointY += 25;
}
Find and Use controls: 查找和使用控件:
var txt = (TextBox)panel1.Controls["someName_1"];
MessageBox.Show(txt.Text);
Some Notes: 一些注意事项:
Unique Names: Pay attention to generate unique names. 唯一名称:请注意生成唯一名称。
Null Checking: You may want add null checking after var txt = (TextBox)panel1.Controls["someName_1"];
空检查:您可能想在
var txt = (TextBox)panel1.Controls["someName_1"];
之后添加空检查var txt = (TextBox)panel1.Controls["someName_1"];
Another Option: You can use this.Controls.Find
另一个选择:您可以使用
this.Controls.Find
You can also use this code, that will return a TextBox
with name of someName_1
: 您还可以使用此代码,它将返回一个名称为
someName_1
的TextBox
:
var txt = this.Controls.Find("someName_1", true).Cast<TextBox>().FirstOrDefault();
Handling Events: You can add TextChanged
event 处理事件:您可以添加
TextChanged
事件
Another thing you may find useful, is adding TextChanged
event when creating controls: 您可能会发现有用的另一件事是在创建控件时添加
TextChanged
事件:
generatedField.TextChanged += generatedField_TextChanged;
This way, you should have this method in form: 这样,您应该以以下形式使用此方法:
void generatedField_TextChanged(object sender, EventArgs e)
{
var txt = (TextBox)sender;
// do what you need with txt.Text and other properties
}
Hmm why not just keep track of what you created? 嗯,为什么不跟踪您的创作呢?
// somewhere else in your code, maybe when the form is created...
var MapOfMyBoxes = new Dictionary<string, TextBox>();
Then modify your code block like this: 然后像这样修改您的代码块:
for(int i = 0; i < numberOfFields; i++)
{
TextBox generatedField = new TextBox();
MapOfMyBoxes.Add("dontUseThisLiteralUseSomethingElse", generatedField);
generatedField.Text = "Please enter Field Report ID Here";
generatedField.Width = 176;
generatedField.Location = new Point(pointX, pointY);
panel1.Controls.Add(generatedField);
panel1.Show();
pointY += 25;
}
Later on you could refer back to your textbox: 稍后,您可以参考您的文本框:
var message = MapOfMyBoxes["dontUseThisLiteralUseSomethingElse"].Text;
Caveat : remember to clean up the dictionary as these textboxes go out of scope/disposed, etc! 注意 :请记住清理字典,因为这些文本框超出了范围/已配置,等等!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.