VB用得習慣后,到C#中來覺得很奇怪,如此好的控件數組怎么不見了。
“眾所周知,控件數組最主要的兩個優點:可以循環附值;可以響應同一個事件。從而大大簡化了代碼。
引自
http://wenku.baidu.com/view/769c436b561252d380eb6e72.html”
但該文提出的方法仍然不適合我的這種情況:比如一個按鈕,一個文本框,界面上放上好幾對(我放6對)
然后,希望實現的功能是點擊一個按鈕,對應的文本框內容顯示“OK”
按鈕點擊:
這個用於處理代碼比較少的,界面對數比較少的。
如果處理代碼比較多,一般再把代碼變為子程序。
但處理的事件子程序還是一樣的多
把按鈕的處理事件都指向同一個事件處理過程,差異就是控件,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;
}
}
CmdClear_Click 時
int lNameLength = (sender as Button).Name.Length;
int lIndex = FVB.Val((sender as Button).Name.Substring(lNameLength - 1));
this.txtLab[lIndex].Text = string.Empty;
this.txtInputField[lIndex].Text = string.Empty;
還有一個方案:在程序中即可創建,但該方案對界面設計比較不方便,不是所見即所得,代碼量也大,所以不討論它。
總結:
原始解決方案:程序中創建控件數組(不是所見即所得,代碼量大)
更好解決方案:程序裝載中控件數組關聯到實際控件(簡單的代碼重復)
最好解決方案:控件命名有規則,程序裝載時遍歷界面所有控件,自動關聯