我們知道.NET的開發平台提了一個名稱空間System.Windows.Forms,在此名稱空間中提供了許多開發Windows Form的類和對象,這些類和對象不僅內容十分豐富,而且還具有十分強大的拓展性,可以利用這些類和對象,簡單而迅速的開發出自己需要的組件來。本文就將介紹如何利用.Net 開發平台原有的類和對象寫一個自己的WinForm組件,如何編譯自己的組件,且如何在一個客戶程序中使用它。
一. 程序設計和運行的基本環境:
(1).視窗2000服務器版
(2)..Net FrameWork SDK Beta 2 版
二. 本文中開發的組件功能介紹:
(1).本文中開發的組件是一個自定義的組件,它是由二個組件合並而成的,一個是標簽組件( Lable ),另外一個是文本框組件( TextBox )。
(2).自定義組件中定義了了二個新的屬性,一個屬性是Text,這個屬性是通過派生原有的文本框中的Text屬性而得到的;另外一個屬性是LabelText,它是通過繼承了原有的標簽的Text屬性而得到的。
(3).組件的用途。
在程序設計中,很多時候是要定義一個標簽,標簽顯示要輸入的文本內容。然後再定義一個文本框,填入信息。使用了本組件後,只要定義一個此組件,然後對組件屬性設定不同的值就可以了。這樣就簡化了程序設計過程。這一點將在後面的組件應用中得到體現。
三. 開發組件中的難點和重點:
(1).如何設定自定義組件的內容:
本組件是由標簽組件和文本框組件組成的,首先要定義此組件的組成結構。具體的程序設計如下:
//LabledTextBox組件是繼承了 UserControl組件的
public class LabeledTextBox : UserControl
{
//定義本組件的組成結構
private Label myLabel ;
private TextBox myTextBox ;
……
}
(2).如何派生文本框中的Text屬性,而生成自己的新的屬性:
由於是派生文本框的Text屬性,所以在程序中用到了關鍵字"override"。並且通過關鍵字"set"設定屬性,"get"關鍵字來讀取組件的屬性值。具體程序設計如下:
//組件中的Text屬性,是從文本框的Text的屬性派生而來
public override string Text
{
get
{
return myTextBox.Text ;
}
set
{
myTextBox.Text = value ;
}
}
(3).如何創建一個新的屬性LabelText,並且此屬性值是通過繼承現有的標簽的"Text"屬性而得到的。具體的程序設計如下:
//創建一個新的屬性LabelText,並且此屬性的值是通過繼承此組件中的標簽的Text屬性值
public string LabelText
{
get
{
return myLabel.Text ;
}
set
{
myLabel.Text = value ;
}
}
四. 自定義組件的源程序代碼( control.cs ):
control.cs源代碼如下:
using System.Windows.Forms ;
//定義封裝此組件的名稱空間
namespace MyControls
{
//LabledTextBox組件是繼承了 UserControl組件的
public class LabeledTextBox : UserControl
{
//定義本組件的組成結構
private Label myLabel ;
private TextBox myTextBox ;
public LabeledTextBox ( )
{
InitializeComponent ( ) ;
}
public void InitializeComponent ( )
{
//定義一個標簽
myLabel = new Label ( ) ;
myLabel.Location = new System.Drawing.Point ( 0 , 0 ) ;
myLabel.Size = new System.Drawing.Size ( 100 , 20 ) ;
//定義一個文本框
myTextBox = new TextBox ( ) ;
myTextBox.Location = new System.Drawing.Point ( 105 , 0 ) ;
myTextBox.Size =new System.Drawing.Size ( 100 , 20 ) ;
//同樣要設定所希望的組件大小
this.Size =new System.Drawing.Size ( 205 , 20 ) ;
//加入組件
this.Controls.Add ( myLabel ) ;
this.Controls.Add ( myTextBox ) ;
}
//組件中的Text屬性,是從文本框的Text的屬性派生而來
public override string Text
{
get
{
return myTextBox.Text ;
}
set
{
myTextBox.Text = value ;
}
}
//創建一個新的屬性LabelText,並且此屬性的值是通過繼承此組件中的標簽的 Text屬性值
public string LabelText
{
get
{
return myLabel.Text ;
}
set
{
myLabel.Text = value ;
}
}
}
}
至此,我們已經完成了一個新的組件的構建過程。下面我們將編譯源程序文件,生產組件.
五. 編譯組件:
到目前為止,我們所做的工作和正常的應用程序的內部編寫一個類沒有什麼區別,所不同的是下面的編譯過程,我們編譯的結果是創建一個庫,而不是一個應用程序。具體的編譯命令如下:
csc /r:system.windows.forms.dll /t:library control.cs
編譯完成後,將得到組件control.dll
六. 創建一個簡單的客戶應用程序:
使用自定義的組件和使用.Net FrameWork SDK中提供的組件沒有任何區別,都是按照以下步驟來進行的:
(1).導入組件的名稱空間,在應用程序中,就是導入MyControls。具體如下:
using MyControls ;
(2).在程序中定義由此名稱空間封裝的組件:在程序中,使用了三個新的組件。具體如下:
protected LabeledTextBox name , address , zip ;
(3).設定這些組件的屬性,在程序中可以看到是如何設定組件的二個自定義的屬性的。下面語句就是介紹如何在程序中定義組件的新屬性。
name = new LabeledTextBox ( ) ;
name.Location = new System.Drawing.Point ( 5 , 5 ) ;
name.LabelText = "姓名:" ;
可見和定義其他屬性沒有什麼區別。
(4).把組件加入到窗體中。
下面就是按照以上步驟所得到的源程序代碼( sample.cs )和此代碼生成的執行文件的運行界面:
sample.cs源程序如下:
using System.Windows.Forms ;
using MyControls ;//導入組件的名稱空間
using System ;
public class Form1 : Form
{
//定義新構建的組件
protected LabeledTextBox name , address , zip ;
protected Button show ;
public Form1 ( )
{
InitializeComponent ( ) ;
}
public static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}
public void InitializeComponent ( )
{
//創建新的組件,此組件中就封裝了標簽和文本框
name = new LabeledTextBox ( ) ;
address= new LabeledTextBox ( ) ;
zip = new LabeledTextBox ( ) ;
show= new Button ( ) ;
//設定新組件的屬性值,可以看看如何設定Text屬性和LabelText屬性
name.Location = new System.Drawing.Point ( 5 , 5 ) ;
name.LabelText = "姓名:" ;
address.Location = new System.Drawing.Point ( 5 , 35 ) ;
address.LabelText = "住址:" ;
zip.Location = new System.Drawing.Point ( 5 , 70 ) ;
zip.LabelText = "郵編:" ;
show.Location = new System.Drawing.Point ( 5 , 100 ) ;
show.Text = "顯示組件屬性值" ;
show.Size = new System.Drawing.Size (100, 25) ;
show.Click += new System.EventHandler ( show_Click ) ;
this.Text = "顯示自建組件的LabelText屬性和Text屬性值!" ;
this.Controls.Add ( name ) ;
this.Controls.Add ( address ) ;
this.Controls.Add ( zip ) ;
this.Controls.Add ( show ) ;
}
protected void show_Click ( object sender , EventArgs e )
{
string message = name.LabelText + " " + name.Text ;
message+="\n" + address.LabelText + " " + address.Text ;
message+="\n" + zip.LabelText + " " + zip.Text ;
MessageBox.Show ( message ,"組件的LabelText屬性和Text屬性值如下:") ;
}
}
經過一下編譯命令:
csc /r:control.dll sample.cs
產生的執行文件的運行界面如下:
七. 總結:
面向組件編程是以後程序設計的一個重要的方向,通過以上介紹,我們可以了解如何用Visual C#進行簡單的組件編程。在用Visual C#編寫組件程序的過程中,也可以看出,比起其他語言來說,用Visual C#編寫組件在編寫和分發的時候,程序員相對輕松了許多,不需要考慮很多問題了,而這些問題在用其他程序設計語言的時候卻是一定要考慮的。為什麼?因為Visual C#已經在底層把這些問題給處理好了。