2012-06-29 41 views
0

我有几个不同的文本框元素命名为“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

http://stackoverflow.com/questions/1536739/c-sharp-get-control-by-name – Henry

+0

winforms?哎呀! –

回答

2

I会提出反对这种方法,因为它容易出错。如果你想重命名它们,如果你忘记这个并添加其他控制名称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上。另外,名字有点 更合乎逻辑......

这种方法适用也当控件上的多个的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)。

+0

尽管这个解决方案非常好,但我认为它不适用于这个应用程序:(文本框位于多个TabPages上,而且名称比e [x]更具逻辑性,但我认为它并不重要举个例子,感谢你:D如果我能弄清楚如何重组组织,那么我可以做到这一点。 –

+0

@AngeloR .:当控件在多个标签页上时,这种方法也适用。 –

+0

啊,谢谢Tim的更新。我对LINQ不太熟悉,所以我从来没有意识到它可以用于这样的事情。我已经改变这是实际的答案,因为它似乎更强大一点,并且导致它教会了我一些关于LINQ的信息:) –

2

你可以用你这样的控件的父(假设你已经放置在表单中的所有控件,所以我用这个)

for(int i= 0; i < 4; ++i) { 
string name = "e" + i; 
TextBox txtBox=this.Controls[name] as TextBox; 
Console.Writeline(txtBox.Text); 
} 
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; 
}