2012-06-29 71 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; 
}