VB用得習慣後,到C#中來以爲很奇怪,如此好的控件數組怎麼不見了。
「衆所周知,控件數組最主要的兩個優勢:能夠循環附值;能夠響應同一個事件。從而大大簡化了代碼。
引自
http://wenku.baidu.com/view/769c436b561252d380eb6e72.html」html
但該文提出的方法仍然不適合個人這種狀況:好比一個按鈕,一個文本框,界面上放上好幾對(我放6對)
而後,但願實現的功能是點擊一個按鈕,對應的文本框內容顯示「OK」數組
按鈕點擊:
這個用於處理代碼比較少的,界面對數比較少的。this
若是處理代碼比較多,通常再把代碼變爲子程序。設計
但處理的事件子程序仍是同樣的多htm
把按鈕的處理事件都指向同一個事件處理過程,差別就是控件,sender就是激發控件的事件?但與其對應的文本控件是誰?索引
通常方法是界面裝載時,把實際的控件裝載到控件數組中去。若是要一行行地裝載
TextBox[] myTextBox = new TextBox[5];
myTextBox[0] = textBox1;
myTextBox[1] = textBox2;
myTextBox[2] = textBox3;
myTextBox[3] = textBox4;
myTextBox[4] = textBox5;
估計本身寫得要發瘋事件
改進一步:由於窗體裏的控件,都被包括在Controls中,因此能夠根據其控件名加以區分。定義控件名稱除了最後一位(或兩位)爲數字索引,前面部分必須相同。這樣在代碼中便可分解索引。示例代碼以下:
FrmCXFA_Load 時
foreach (Control oCon in this.Controls)
{
int lNameLength = oCon.Name.Length;
int lIndex = FVB.Val(oCon.Name.Substring(lNameLength - 1));
switch (oCon.Name.Substring(0, oCon.Name.Length - 1))
{
case "txtLab":
this.txtLab[lIndex] = (TextBox)oCon;
break;
case "txtInputField":
this.txtInputField[lIndex] = (TextBox)oCon;
break;
case "cmbClear":
this.cmbClear[lIndex] = (Button)oCon;
break;
}
}get
CmdClear_Click 時
int lNameLength = (sender as Button).Name.Length;
int lIndex = FVB.Val((sender as Button).Name.Substring(lNameLength - 1));string
this.txtLab[lIndex].Text = string.Empty;
this.txtInputField[lIndex].Text = string.Empty;it
還有一個方案:在程序中便可建立,但該方案對界面設計比較不方便,不是所見即所得,代碼量也大,因此不討論它。
總結:原始解決方案:程序中建立控件數組(不是所見即所得,代碼量大)更好解決方案:程序裝載中控件數組關聯到實際控件(簡單的代碼重複)最好解決方案:控件命名有規則,程序裝載時遍歷界面全部控件,自動關聯