C#中控件數組的討論


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;

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM