以前在用Delphi寫程序的時候,總不喜歡在窗體上排放很多組件,這一方面有點不美觀,並且在調試程序時候,也不是十分方便。通常在寫程序的時候,當要用到某些組件,采用的方法一般都是動態創建,用完以後就釋放掉。Visual C#在程序運行的時候也可以動態創建組件,下面就結合一個程序例子來具體介紹如何用Visual C#動態生成組件。首先讓我們了解一下,在動態創建組件的過程中要用到的一些概論和理論。
一. Boxing (裝箱)和Unboxing (出箱):
在用Visual C#動態創建組件的時候,要涉及到二種數據類型變量的轉換,這二種類型變量就是實值類型(Value Type)變量和參考類型(Reference Type)變量,而這種轉換過程在Visual C#中被稱為Boxing (裝箱)和Unboxing (出箱)。其中把實值類型變量轉換成參考類型變量就是Boxing (裝箱);把參考類型變量轉換成實值類型變量就是Unboxing (出箱)。那麼什麼是實值類型,說的簡單些,就是我們平常使用的整型、布爾型、枚舉型等,這些類型的變量就是實值類型變量了;所謂參考類型,在Visual C#中指的就是Object、Class、Interface、Delegate、String、Array等,他和實值類型最主要的不同之處就是,參考類型變量存放的是指向實體對象的指針,而實值類型變量卻是實實在在地實體對象。在本文介紹的程序中,主要涉及的是出箱。具體的處理方法,在下面有著具體介紹。
二. 本文中程序設計和運行的環境:
(1).微軟公司視窗2000服務器版
(2)..Net FrameWork SDK Beta 2
三. 程序設計中的關鍵步驟以及解決方法:
文中軟件主要功能是用通過窗體上的二個按鈕來創建二個不同類型的WinForm組件--Button組件和TextBox組件,並在創建的同時為每一個組件的屬性賦值,給每一個創建的組件也創建了事件。
(1).如何在窗體上創建Button組件:
其實用Visual C#創建一個組件是十分方便的,只用下列二行語句就可以完成了:
//創建一個新的Button組件 Button myButton = new Button ( ) ; //在窗體中顯示此按鈕 this.Controls.Add ( myButton ) ; 但此時創建的這個Button組件沒有任何屬性,並且也沒有任何事件,在本文中介紹的程序中創建的Button組件,不僅有屬性也有事件,下列語句就是本文程序創建Button組件源代碼: //按鈕數量計算器在每次按鈕按動後加"1" counter += 1 ; //對要產生的按鈕的縱坐標的相對位置是前一個產生按鈕的相對位置的縱坐標加"3" locY += this.btnAdd.Height + 3 ; //創建一個新的Button組件 Button myButton = new Button ( ) ; //設定他的名稱和Text屬性,以及產生的相對位置 myButton.Name = "Button " + counter ; myButton.Text = "按鈕 " + counter ; myButton.Location = new Point ( btnAdd.Location.X , locY ) ; //為產生的新的Button組件設定事件,本文中為產生的按鈕設定了三個事件 myButton.MouseEnter += new System.EventHandler ( this.btn_MouseEnter ) ; myButton.MouseLeave += new System.EventHandler ( this.btn_MouseLeave ) ; myButton.Click += new System.EventHandler ( this.btn_Click ) ; //在窗體中顯示此按鈕 this.Controls.Add ( myButton ) ;
程序不僅為每一個組件的屬性都賦值,而且為每一個組件都創建了三個事件。細心的讀者可能已經注意到,程序為每一個組件創建的事件的名稱都是一樣的。這樣就有一個問題,如何在這一樣的事件中,識別到底是哪個Button組件觸發了事件。
(2).確定是哪個組件觸發了事件:
由於程序中為每一個創建的Button組件的事件都是一樣的,要想正確處理這些組件的事件,就需要在事件觸發的程序中判斷到底是哪個組件觸發了這個事件。這就需要用到上面所提出的裝箱和出箱。我們知道Sender對象是一個參考類型變量,他存放的是指向觸發當前事件實體對象的指針。要把他給轉換成實值對象類型,通過下列語句就可以確定是哪個組件觸發了當前事件:
private void btn_MouseEnter ( object sender , System.EventArgs e ) { //出箱 Button currentButton = ( Button ) sender ; //設定按鈕的背景色 currentButton.BackColor = Color.Red ; }
其他事件可以仿照此事件的處理過程來處理。
本文示例代碼或素材下載