C#中控件數組的討論

VB用得習慣後,到C#中來以爲很奇怪,如此好的控件數組怎麼不見了。
「衆所周知,控件數組最主要的兩個優勢:能夠循環附值;能夠響應同一個事件。從而大大簡化了代碼。
引自
http://wenku.baidu.com/view/769c436b561252d380eb6e72.htmlhtml

但該文提出的方法仍然不適合個人這種狀況:好比一個按鈕,一個文本框,界面上放上好幾對(我放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

還有一個方案:在程序中便可建立,但該方案對界面設計比較不方便,不是所見即所得,代碼量也大,因此不討論它。

總結:原始解決方案:程序中建立控件數組(不是所見即所得,代碼量大)更好解決方案:程序裝載中控件數組關聯到實際控件(簡單的代碼重複)最好解決方案:控件命名有規則,程序裝載時遍歷界面全部控件,自動關聯

相關文章
相關標籤/搜索