C#實現控制元件陣列

weixin_34377065發表於2012-07-16

DotNet裡取消了控制元件陣列,這讓習慣了使用VB控制元件的程式設計師非常不適應。有什麼辦法能夠實現控制元件陣列的功能嗎?答案是肯定的。

       眾所周知,控制元件陣列最主要的兩個優點:可以迴圈附值;可以響應同一個事件。從而大大簡化了程式碼。下面根據這兩個方面,舉一個例子。

       新建一個工程,在窗體上新增5個textbox(textBox1...textBox5)和2個button (button1、button2)。

       1.迴圈附值

          總的來說,有兩種實現方法:

          1.1 定義動態的控制元件陣列。因為DotNet裡支援動態的控制元件陣列,所以我們可以把已設計好的控制元件,附給動態的陣列,這樣就可以任意的使用了。程式碼如下:

               private void button1_Click(object sender, System.EventArgs e)

               {
                      TextBox[] myTextBox = new TextBox[5];
                      myTextBox[0] = textBox1;
                       myTextBox[1] = textBox2;
                      myTextBox[2] = textBox3;
                      myTextBox[3] = textBox4;
                      myTextBox[4] = textBox5;

                     for ( int i=0;i< 5;i++)
                     {
                            myTextBox[i].Text = "fill_1";
                     }
                }

         1.2 利用窗體的控制元件陣列。因為窗體裡的控制元件,都被包括在Control裡面,所以可以根據其類別加以區分。程式碼如下:

         private void button2_Click(object sender, System.EventArgs e)
         {
               foreach(Control myControls in this.Controls)
              {
                    if (myControls.ToString().IndexOf("TextBox") > 0 )
                     {
                          myControls.Text ="fill_2";
                     }

               }
          }

       2.事件響應

          讓陣列裡的控制元件都響應同一個相應的事件,通過起在陣列裡唯一的標識,再將他們加以區分。下面一個例子,使5個textBox響應同一個keypress事件。

           自定義一個控制元件事件-- textBox_KeyPress ,程式碼如下:

          private void textBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
           {
                  TextBox box = (TextBox)sender;
   
                  MessageBox.Show(this,"you choose " + box.Name + " and you keypress " + e.KeyChar.ToString() ,"try" ,MessageBoxButtons.OK );
          }

          選定textBox1,按F4顯示其屬性頁,選擇"Events"按鈕(就是那個小閃電),列出了textBox1的所有事件,在keypress裡寫我們想讓他相應的事件的名字--textBox_KeyPress,這樣,當textBox1產生keypress事件時,他相應的是textBox_KeyPress這個我們自定義的事件。同樣,對其它的textBox控制元件也做如上的屬性設定。這樣,5個textBox同時響應一個keypress事件,而可以通過object sender的不同,可以加以區分。這樣就達到了陣列的效果。

用C#實現簡單的控制元件陣列

  我的一個同學在做計算器程式,另一個同學在做井字棋遊戲。這兩個程式有個共同的特點:包含數個具有同類功能的控制元件(計算器的數字按鈕及井字棋的九個落子位)。如果一個個地建立這些控制元件,不得不寫大量重複的程式碼,修改起來比較麻煩。一個更好的選擇是建立控制元件陣列。下面是Button陣列的簡單實現:

   Button[] btns = new Button[9];

   private void ShowButtonArray()
   {
    for(int i = 0; i < 9; i++)
    {
     btns[i] = new Button(); //這一句往往為初學者忽視,須知要建立物件的例項!
     btns[i].Location = new System.Drawing.Point(100 + 50 * (i % 3),100 + 50 * (i / 3));
     btns[i].Name = "btnTest";
     btns[i].Size = new System.Drawing.Size(48, 48);
     btns[i].Text = i.ToString();
     btns[i].Click += new System.EventHandler(this.btns_Click); //統一的事件處理
     this.Controls.Add(btns[i]); //在窗體上呈現控制元件
    }
   }

   private void btns_Click(object sender, System.EventArgs e)
   {
    MessageBox.Show(((Button)sender).Text + " was clicked !"); //通過sender判斷激發事件的控制元件
   }

   private void Form1_Load(object sender, System.EventArgs e)
   {
    ShowButtonArray();
   }

  事實上,大家只要看一遍“Windows 窗體設計器生成的程式碼”,就很快能理解.Net建立並呈現控制元件的過程,從而寫出簡單的控制元件陣列。在上例中,Button呈現的位置是通過一個的公式計算出的,在實際的運用中,可以根據需要靈活變化(比如計算器的數字按鈕,1~9可以用公式算出,0則可以用if之類的語句特殊處理)。同時值得注意的是對事件的統一處理:在btns_Click函式中通過sender判斷激發事件的控制元件。

  如果有必要,可以將控制元件陣列封裝成類,加上一定的功能程式碼,便於靈活使用。甚至可以將一些自定義控制元件做成陣列類,實現更加複雜的功能。

 

給你舉個例子吧:
在某個Form的某個方法中:

//先建立陣列
Label[] lblArray = {new Label(),new Label()};

//設定屬性
lblArray[0].Location = new System.Drawing.Point(132, 280);
lblArray[0].Name = "label_0";
lblArray[0].Size = new System.Drawing.Size(64, 16);
lblArray[0].TabIndex = 1;
lblArray[0].Text = "label_0";

lblArray[1].Location = new System.Drawing.Point(232, 280);
lblArray[1].Name = "label_1";
lblArray[1].Size = new System.Drawing.Size(64, 16);
lblArray[1].TabIndex = 2;
lblArray[1].Text = "label_1";

//最後一條語句尤其重要,如果不寫,則控制元件不能在窗體上顯示。
this.Controls.AddRange(lblArray);  

 

逐個自己寫程式碼啊,太煩了吧,看看這樣行不行:
private System.Windows.Forms.Button[] ba={null, null};

private void Init()
{
ba[0]=button1;
ba[1]=button2;
}
這樣你大可以先在窗體上設計好你的控制元件,不用自己寫程式碼。

相關文章