我有几个不同的TextBox元素,其名称如下:" e0"," e1"," e2"," e3"。我知道有多少,我只是希望能够遍历它们并获取它们的值而不是手动输入每个值。
我假设我会做这样的事情,我只是不知道如何访问该元素。
for(int i= 0; i < 4; ++i) {
string name = "e" + i;
// How do I use my newly formed textbox name to access the textbox
// element in winforms?
}
答案 0 :(得分:2)
您可以像这样使用控件的父级(假设您已将所有控件放在表单中,所以我使用了它)
for(int i= 0; i < 4; ++i) {
string name = "e" + i;
TextBox txtBox=this.Controls[name] as TextBox;
Console.Writeline(txtBox.Text);
}
答案 1 :(得分:2)
我建议反对这种方法,因为它容易出错。如果您想重命名它们,如果您忘记了这一点并添加名为e...
的其他控件,该怎么办?
相反,我会在像Panel
这样的容器控件中收集它们。
然后,您可以使用LINQ
查找相关的TextBoxes
:
var myTextBoxes = myPanel.Controls.OfType<TextBox>();
Enumerable.OfType
会相应地过滤和转换控件。如果您想要更多地过滤它们,可以使用Enumerable.Where
,例如:
var myTextBoxes = myPanel.Controls
.OfType<TextBox>()
.Where(txt => txt.Name.ToLower().StartsWith("e"));
现在您可以迭代那些TextBoxes
,例如:
foreach(TextBox txt in myTextBoxes)
{
String text = txt.Text;
// do something amazing
}
修改:
TextBoxes位于多个TabPages上。而且,名字有点 更符合逻辑......
当控件位于多个标签页上时,此方法也适用,例如:
var myTextBoxes = from tp in tabControl1.TabPages.Cast<TabPage>()
from panel in tp.Controls.OfType<Panel>()
where panel.Name.StartsWith("TextBoxGroup")
from txt in panel.Controls.OfType<TextBox>()
where txt.Name.StartsWith("e")
select txt;
(请注意,我添加了另一个条件,即面板名称'必须以TextBoxGroup
开头,只是为了表明您还可以合并条件)
当然,检测相关控件的方法可以根据需要进行更改(例如RegularExpression
)。
答案 2 :(得分:0)
试试这个:
this.Controls.Find()
for(int i= 0; i < 4; ++i) {
string name = "e" + i;
TextBox txtBox = this.Controls.Find(name) as TextBox;
}
或者这个:
this.Controls["name"]
for(int i= 0; i < 4; ++i) {
string name = "e" + i;
TextBox txtBox = this.Controls[name] as TextBox;
}