熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用Visual C#動態生成組件

2013-11-13 09:55:21  來源: .NET編程 

  通常在寫程序的時候當要用到某些組件采用的方法一般都是動態創建用完以後就釋放掉Visual C#在程序運行的時候也可以動態創建組件下面就結合一個程序例子來具體介紹如何用Visual C#動態生成組件首先讓我們了解一下在動態創建組件的過程中要用到的一些概論和理論

  一. Boxing (裝箱)和Unboxing (出箱)

  在用Visual C#動態創建組件的時候要涉及到二種數據類型變量的轉換這二種類型變量就是實值類型(Value Type)變量和參考類型(Reference Type)變量而這種轉換過程在Visual C#中被稱為Boxing (裝箱)和Unboxing (出箱)其中把實值類型變量轉換成參考類型變量就是Boxing (裝箱)把參考類型變量轉換成實值類型變量就是Unboxing (出箱)那麼什麼是實值類型說的簡單些就是我們平常使用的整型布爾型枚舉型等這些類型的變量就是實值類型變量了所謂參考類型在Visual C#中指的就是ObjectClassInterfaceDelegateStringArray等他和實值類型最主要的不同之處就是參考類型變量存放的是指向實體對象的指針而實值類型變量卻是實實在在地實體對象在本文介紹的程序中主要涉及的是出箱具體的處理方法在下面有著具體介紹
 
二. 程序設計中的關鍵步驟以及解決方法

  文中軟件主要功能是用通過窗體上的二個按鈕來創建二個不同類型的WinForm組件Button組件和TextBox組件並在創建的同時為每一個組件的屬性賦值給每一個創建的組件也創建了事件

  (如何在窗體上創建Button組件

    其實用Visual C#創建一個組件是十分方便的只用下列二行語句就可以完成了

//創建一個新的Button組件
Button myButton = new Button ( ) ;
//在窗體中顯示此按鈕
thisControlsAdd ( myButton ) ;

但此時創建的這個Button組件沒有任何屬性並且也沒有任何事件在本文中介紹的程序中創建的Button組件不僅有屬性也有事件下列語句就是本文程序創建Button組件源代碼

//按鈕數量計算器在每次按鈕按動後加
counter += ;
//對要產生的按鈕的縱坐標的相對位置是前一個產生按鈕的相對位置的縱坐標加
locY += thisbtnAddHeight + ;
//創建一個新的Button組件
Button myButton = new Button ( ) ;
//設定他的名稱和Text屬性以及產生的相對位置
myButtonName = Button + counter ;
myButtonText = 按鈕 + counter ;
myButtonLocation = new Point ( btnAddLocationX locY ) ;
//為產生的新的Button組件設定事件本文中為產生的按鈕設定了三個事件
myButtonMouseEnter += new SystemEventHandler ( thisbtn_MouseEnter ) ;
myButtonMouseLeave += new SystemEventHandler ( thisbtn_MouseLeave ) ;
myButtonClick += new SystemEventHandler ( thisbtn_Click ) ;
//在窗體中顯示此按鈕
thisControlsAdd ( myButton ) ;

  程序不僅為每一個組件的屬性都賦值而且為每一個組件都創建了三個事件細心的讀者可能已經注意到程序為每一個組件創建的事件的名稱都是一樣的這樣就有一個問題如何在這一樣的事件中識別到底是哪個Button組件觸發了事件

  (確定是哪個組件觸發了事件

  由於程序中為每一個創建的Button組件的事件都是一樣的要想正確處理這些組件的事件就需要在事件觸發的程序中判斷到底是哪個組件觸發了這個事件這就需要用到上面所提出的裝箱和出箱我們知道Sender對象是一個參考類型變量他存放的是指向觸發當前事件實體對象的指針要把他給轉換成實值對象類型通過下列語句就可以確定是哪個組件觸發了當前事件

private void btn_MouseEnter ( object sender SystemEventArgs e )
{
//出箱
Button currentButton = ( Button ) sender ;
//設定按鈕的背景色
currentButtonBackColor = ColorRed ;
}
  其他事件可以仿照此事件的處理過程來處理

  ( 如何在窗體上創建TextBox組件

  創建TextBox組件的過程和創建Button組件過程相類似只是在創建的組件類型上面有一點區別具體實現語句如下

//文本框數量計算器在每次按鈕按動後加
counter += ;
//對要產生的文本框的縱坐標的相對位置是前一個產生按鈕的相對位置的縱坐標加
locY += thistxtAddHeight + ;
//創建一個新的TextBox組件
TextBox myBox = new TextBox ( ) ;
//設定他的名稱和Text屬性以及產生的位置
myBoxName = TextBox + counter ;
myBoxText = 文本框 + counter ;
myBoxLocation = new Point ( txtAddLocationX locY ) ;
//為產生的新的TextBox組件設定事件本文中為產生的文本框設定了一個事件
myBoxClick += new SystemEventHandler ( thisbtn_Click ) ;
//在窗體中顯示此文本框
thisControlsAdd ( myBox ) ;

  此時細心的讀者又會發現為每一個TextBox組件創建Click事件和為Button組件創建的Click事件也是一樣的這樣在Click事件中不僅要判斷是哪個組件觸發了事件還要判斷是那種類型的組件觸發了事件下面語句是實現這些判斷地具體方法

private void btn_Click ( object sender SystemEventArgs e )
{
 if ( senderGetType ( ) == typeof ( Button ) )
 {
  Button control = ( Button ) sender ;
  MessageBoxShow ( controlText + 被按動了!);
 }
 else
 {
  TextBox control = ( TextBox ) sender ;
  MessageBoxShow ( controlText + 被按動了! ) ;
 }
}
  當然如果你也可以單獨為TextBox組件創建Click事件此時創建的事件語句可改為

myBoxClick += new SystemEventHandler ( thistxt _Click ) ;

  下面是實現txt _Click ( )事件的程序代碼

private void txt_Click ( object sender SystemEventArgs e )
{
 TextBox currentButton = ( TextBox ) sender ;
 MessageBoxShow ( currentButtonText + 被按動了!);
}

  三. 本文中源程序已經程序運行的界面

  下面這些圖是程序運行

  圖程序中動態創建了組件  

單擊創建的按鈕的結果圖 

  

  圖單擊創建的文本框的結果圖 

  


  下面是實現上面結果的程序源代碼
using System ;
using SystemDrawing ;
using SystemCollections ;
using SystemComponentModel ;
using SystemWindowsForms ;
using SystemData ;
namespace DynamicControls
{
public class Form : Form
{
private Button btnAdd ;
private SystemComponentModelContainer components = null ;
private Button txtAdd ;
//給產生的按鈕定義一個數量計算器
private int counter ;
//給產生的按鈕定義相對位置的縱坐標
private int locY ;
//給產生的文本框定義一個數量計算器
private int counter ;
//給產生的文本框定義相對位置的縱坐標
private int locY ;
public Form ( )
{
InitializeComponent ( ) ;
//初始化產生的按鈕何文本框位置的縱坐標
locY = thisbtnAddLocationY ;
locY = thistxtAddLocationY ;
}

  //清除在程序中使用到的資源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
componentsDispose ( ) ;
}
}
baseDispose ( disposing ) ;
}

  private void InitializeComponent ( )
{
thisbtnAdd = new Button ( ) ;
thistxtAdd = new Button ( ) ;
thisSuspendLayout ( ) ;

  thisbtnAddFlatStyle = FlatStylePopup ;
thisbtnAddLocation = new SystemDrawingPoint ( ) ;
thisbtnAddName = btnAdd ;
thisbtnAddTabIndex = ;
thisbtnAddText = 生成按鈕! ;
thisbtnAddClick += new SystemEventHandler ( thisbtnAdd_Click ) ;

  thistxtAddFlatStyle = FlatStylePopup ;
thistxtAddLocation = new SystemDrawingPoint ( ) ;
thistxtAddName = txtAdd ;
thistxtAddTabIndex = ;
thistxtAddText = 生成文本框! ;
thistxtAddClick += new SystemEventHandler ( thistxtAdd_Click ) ;

  thisAutoScaleBaseSize = new SystemDrawingSize ( ) ;
thisClientSize = new SystemDrawingSize ( ) ;
thisControlsAdd ( btnAdd ) ;
thisControlsAdd ( txtAdd ) ;
thisName = Form ;
thisText = 在Visual C#中如何動態產生組件! ;
thisResumeLayout ( false ) ;

  }
static void Main ( )
{
ApplicationRun ( new Form ( ) ) ;
}
private void btnAdd_Click ( object sender SystemEventArgs e )
{
//按鈕數量計算器在每次按鈕按動後加
counter += ;
//對要產生的按鈕的縱坐標的相對位置是前一個產生按鈕的相對位置的縱坐標加
locY += thisbtnAddHeight + ;
//創建一個新的Button組件
Button myButton = new Button ( ) ;
//設定他的名稱和Text屬性以及產生的位置
myButtonName = Button + counter ;
myButtonText = 按鈕 + counter ;
myButtonLocation = new Point ( btnAddLocationX locY ) ;

  //為產生的新的Button組件設定事件本文中為產生的按鈕設定了三個事件
myButtonMouseEnter += new SystemEventHandler ( thisbtn_MouseEnter ) ;
myButtonMouseLeave += new SystemEventHandler ( thisbtn_MouseLeave ) ;
myButtonClick += new SystemEventHandler ( thisbtn_Click ) ;
//在窗體中顯示此按鈕
thisControlsAdd ( myButton ) ;
}

  private void txtAdd_Click ( object sender SystemEventArgs e )
{
//文本框數量計算器在每次按鈕按動後加
counter += ;
//對要產生的文本框的縱坐標的相對位置是前一個產生按鈕的相對位置的縱坐標加
locY += thistxtAddHeight + ;
//創建一個新的TextBox組件
TextBox myBox = new TextBox ( ) ;
//設定他的名稱和Text屬性以及產生的位置
myBoxName = TextBox + counter ;
myBoxText = 文本框 + counter ;
myBoxLocation = new Point ( txtAddLocationX locY ) ;
//為產生的新的TextBox組件設定事件本文中為產生的文本框設定了一個事件
myBoxClick += new SystemEventHandler ( thisbtn_Click ) ;
//在窗體中顯示此文本框
thisControlsAdd ( myBox ) ;
}
private void btn_MouseEnter ( object sender SystemEventArgs e )
{
 //出箱
 Button currentButton = ( Button ) sender ;
 //設定按鈕的背景色
 currentButtonBackColor = ColorRed ;
}

  private void btn_MouseLeave ( object sender SystemEventArgs e )
{
 //出箱
 Button currentButton = ( Button ) sender ;
 currentButtonBackColor = ControlDefaultBackColor ;
}

  private void btn_Click ( object sender SystemEventArgs e )
{
 if ( senderGetType ( ) == typeof ( Button ) )
 {
  Button control = ( Button ) sender ;
  MessageBoxShow ( controlText + 被按動了!);
 }
 else
 {
  TextBox control = ( TextBox ) sender ;
  MessageBoxShow ( controlText + 被按動了! ) ;
 }
}

  }
}

  四. 總結

  通過上面介紹不難看出動態創建組件並不是一件很難的事情難就難在為這個組件創建事件上面因為這涉及到實值類型變量和參考類型變量的轉換這就是所謂的裝箱和出箱的問題當然在程序設計的時候你不僅可以創建那些可見的組件也可以創建那些不可見的組件具體的實現方法和本文中的方法類似


From:http://tw.wingwit.com/Article/program/net/201311/11981.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.