2012-07-23 74 views
4

有C#索引控件數組嗎?我想把一個「按鈕數組」例如5個按鈕,只使用一個事件處理程序處理所有這5個控件的索引(如VB6)。否則,我必須爲這5個按鈕中的每一個編寫一個額外的事件處理程序。如果我有100個按鈕,我需要100個事件處理程序?我的意思是這樣的:製作索引控制數組?

TextBox1[i].Text="Example"; 

它可以使編碼更容易我使用控制數組。現在我已經看到,C#至少在用戶控件上沒有可見的數組功能,在用戶控件上沒有「index」屬性。所以我猜C#沒有控制數組,或者我必須通過已知名稱調用每個元素。

而不是在給100名的文本框爲循環遞增100價值,我必須寫:

TextBox1.Text = Value1; 
TextBox2.Text = Value2; 
... 
... 
TextBox100.Text = Value100; 

很多更多的工作+所有這些100個事件處理程序爲每一個額外的文本框額外費用。

+1

每個父母控制有一個屬性['.Controls'](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controls(V = VS .71).aspx),它可以訪問一系列子控件。如果將所有文本框/按鈕放在同一個父容器中,則可以通過子控件列表引用它們。 – mellamokb 2012-07-23 21:43:22

+2

您可以將相同的事件處理程序分配給多個控件,您無需爲每個控件實例創建新的事件處理程序實現。 – 2012-07-23 21:44:14

+0

您可能有一些實施ICollection 的運氣,其中T:Control,但不能將一個事件處理程序添加到數組中。 – 2012-07-23 21:44:26

回答

4

正如我在HatSoft提出的解決方案中提到的那樣,C#Winforms不允許您創建像舊VB6一樣的控件數組。我想我們可以找到的最接近的就是HatSoft和Bert Evans在帖子中顯示的內容。

一兩件事,我希望將滿足您的要求爲事件處理程序,你在事件處理程序的常見事件處理程序,當你強制轉換的「發件人」你直接得到控制,就像你會在VB6

C#

TextBox textBox = sender as TextBox; 

VB6

TextBox textBox = TextBox1[i]; 

所以你可能是接線的100個文本框到一個單一的事件處理程序,如果你AR唯一的麻煩e不是通過代碼動態創建控件,而是在設計時手動創建控件,那麼所有人都可以建議將它們分組在容器中,比如說面板。然後在窗體的Load線他們都到一個單一的事件處理程序是這樣的:

foreach (Control control in myTextBoxPanel.Controls) 
{ 
    if(control is TextBox) 
     control.TextChanged += new EventHandler(control_TextChanged); 
} 
2

只需創建一個處理程序並將所有按鈕指向它。

var ButtonHandler = (sender, args) => { 
    var clicked = (Button)sender; 
    if (clicked.Text == "whatever") 
     //do stuff 
    else 
     //do other stuff 
}; 

button1.Click += ButtonHandler; 
button2.Click += ButtonHandler; 

另外,如果你在代碼中創建控件,您可以使用one of the techniques specified in this answer。的

+0

啊,你提到了usercontrols,我得出了一個結論。 – Bert 2012-07-23 21:51:21

+0

底線,創建一個事件處理程序,並將其分配給控件事件。 – Bert 2012-07-23 22:05:36

+0

@feedwall處理程序接收發件人作爲參數。如果您爲每個控件分配一個值,則可以檢查該值以確定單擊哪個控件。 – Bert 2012-07-24 00:18:42

2

而是在給100名的文本框爲環100增加值,我必須寫:

for(int i = 0; i <100; i++) 
{ 
    TextBox t = new TextBox(){ Id = "txt_" + i, Value = "txt_" + i}; 
    t.TextChanged += new System.EventHandler(this.textBox_Textchanged); 
    Page.Controls.Add(t); 

} 

//and for event on TextChanged 
private void textBox_Textchanged(object sender, EventArgs e) 
    { 
     TextBox textBox = sender as TextBox; 

     if (textBox != null) 
     { 
//// 
     } 
    } 
+0

@feedwall:不,在設計時你不能像VB6那樣擁有一個數組。但是,您可以爲所有控件設置通用事件處理程序,但是您需要在設計時或通過代碼手動連接它們。 – 2012-07-24 03:55:26

0

如果您正在使用Web窗體的工作,而不是MVC,您可以存取權限一個在頁面上收集控件,如Using the Controls Collection in an ASP.NET Web Page所示。基本上,控件集合是一個樹,其中託管第一級子控件的頁面和一些具有自己的子項的項目。有關如何關注樹的示例,請參閱How to: Locate the Web Forms Controls on a Page by Walking the Controls Collection

此外,請參閱How to: Add Controls to an ASP.NET Web Page Programmatically

只要所需的簽名相同,就可以對多個項目使用相同的事件處理程序。

對於Windows窗體,由於它們基於相似的體系結構模型,因此幾乎相同,但您需要Control.Controls PropertyHow to: Add Controls to Windows Forms

+0

就基本體系結構而言,Windows窗體和Web窗體模型幾乎完全相同。許多技術都適用。我已經增加了一些答案。 – JamieSee 2012-07-23 23:18:49

0

另一件事要注意:如果你真的需要一個編輯窗體上100個字符串,你應該想想100個文本框是否真的是最好的辦法。也許ListView,DataGridView或PropertyGrid會更適合。

這幾乎適用於您認爲需要大量控制的任何時間。

5

我知道我是一個有點晚了這個晚會,但是這種解決方案將工作:

做一個全局數組:

TextBox[] myTextBox; 

然後在你的對象的構造函數,調用後

InitializeComponent(); 

初始化數組:

myTextBox = new TextBox[] {TextBox1, TextBox2, ... }; 

現在你可以重複你的控件數組:

for(int i = 0; i < myTextBox.Length; i++) 
     myTextBox[i].Text = "OMG IT WORKS!!!"; 

我希望這有助於!

皮特