0

我有几个不同的 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?
}
4

3 回答 3

2

您可以像这样使用控件的父级(假设您已将所有控件放在表单中,所以我使用了这个)

for(int i= 0; i < 4; ++i) {
string name = "e" + i;
TextBox txtBox=this.Controls[name] as TextBox;
Console.Writeline(txtBox.Text);
}
于 2012-06-29T11:10:50.103 回答
2

我建议不要使用这种方法,因为它容易出错。如果您想重命名它们怎么办,如果您忘记了这一点并添加其他带有 name 的控件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
}

编辑

文本框位于多个 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,只是为了表明您也可以组合这些条件)

当然,可以根据需要更改检测相关控件的方式(fe 和RegularExpression)。

于 2012-06-29T11:13:23.893 回答
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;
}
于 2012-06-29T11:11:41.413 回答