元件和控制元件的區別:
1、Component在RunTime時不能呈現UI,而Control可以在RunTime時呈現UI(但是vs2005裡的asp.net中的SqlDataSource是Control,但是它不能呈現UI)。
2、Component是貼在容器Container上的,而Control則是貼在WindowsForm或者WebForm上的。
舉例來說,SqlCommand是個Component,DataGrid則是一個Control。
類:
如果您的類使用外部資源但不用於設計圖面,則實現System.IDisposable,或者從直接或間接實現IDisposable的類派生。
如果您的類要用於設計圖面(如Windows窗體或Web窗體設計器),則實現System.ComponentModel.IComponent,或者從直接或間接實現IComponent的類派生。請注意,IComponent擴充套件IDisposable,因此IComponent型別始終是IDisposable型別。與不是IComponent的IDisposable型別相比,IComponent型別的效能系統開銷要小。但這一不足通常可由在設計時和執行時安置IComponent的能力來彌補。(在本主題的後面部分將對該安置功能進行說明)。
如果希望類可設計(在設計圖面上使用)並且可按引用封送,可從System.ComponentModel.Component派生。Component是按引用封送的IComponent型別的基實現。
如果希望可設計的類可按值封送,可從System.ComponentModel.MarshalByValueComponent派生。MarshalByValueComponent是按值封送的IComponent型別的基實現。
如果希望向物件模型層次中引入IComponent型別,但由於單次繼承的原因而不能從Component或MarshalByValueComponent之類的基派生,請實現IComponent。
如果需要提供使用者介面的可設計類,則該類是控制元件。控制元件必須直接或間接從下列基控制元件類之一派生:System.Windows.Forms.Control或System.Web.UI.Control。
注意
如果您的類既不是可設計類,也不儲存外部資源,則不需要IComponent或IDisposable型別。
下面是元件、控制元件、容器和站點的定義。
元件
在.NETFramework中,元件是指實現System.ComponentModel.IComponent介面的一個類,或從實現IComponent的類中直接或間接派生的類。在程式設計中,“元件”這個術語通常用於可重複使用並且可以和其他物件進行互動的物件。.NETFramework元件滿足這些一般要求,另外還提供諸如控制外部資源和設計時支援等功能。
控制外部資源
IComponent介面擴充套件IDisposable介面,後者在其協定中有一個名為Dispose的方法。在其Dispose方法實現中,元件必須顯式釋放外部資源。與垃圾回收過程中發生的預設、不確定的清理相比,這提供了一個確定的方法來釋放資源。開發人員必須在整個包容層次結構中傳播Dispose以確保元件的子級同時釋放資源。另外,派生的元件必須呼叫其基類的Dispose方法。
即使透過Dispose提供對資源的顯式控制,也應該始終透過終結器(解構函式)提供隱式清理,以防使用者未能對您的元件呼叫Dispose時資源永久洩漏。
下面的示例顯示了在基元件和在派生的元件中實現Dispose的方式。
C#
publicclassBaseComponent:IComponent{
//IComponentextendsIDisposable.
publicvoidDispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protectedvirtualvoidDispose(booldisposing){
if(disposing){
//Freeotherstate(managedobjects).
//Freeyourownstate(unmanagedobjects).
//SimplycallDispose(false).
~BaseComponent(){
Dispose(false);
//Derivedcomponent.
publicclassDerivedComponent:BaseComponent{
protectedoverridevoidDispose(booldisposing){
//Freeotherstate.
//YoumustinvoketheDisposemethodofthebaseclass.
base.Dispose(disposing);
//Freeyourownstate.
...
//Nofinalizer/destructor.
//NoDispose()method.
設計時支援
在.NETFramework中,元件的一個重要功能就是它們是可設計的,這意味著作為元件的類可用於快速應用程式開發(RAD)環境(如VisualStudio)中。可將元件新增到VisualStudio的工具箱中,也可將元件拖放到某個窗體上,還可以在設計圖面上對元件進行操作。請注意,對IComponent型別的基本設計時支援已經內置於.NETFramework中;元件開發人員無須進行額外的工作就可利用基本設計時功能。
有關設計時支援的更多資訊,請參見元件的設計時屬性(Attribute)和擴充套件設計時支援。
承載元件
元件可以被放置(承載)在一個容器(本主題稍後部分進行了定義)中。當元件被放置後,它透過其站點(本主題稍後部分進行了定義)與容器進行互動並能夠透過站點從其容器查詢並得到服務。為了確保容器拆卸後資源被釋放,容器必須實現IDisposable介面。在其Dispose方法的實現中,容器必須釋放它保留的所有資源,並呼叫它包含的每個元件的Dispose方法。
包容是邏輯上的,不需要可視的表示形式。放置資料庫元件的中間層容器就是非可視包容的一個示例。可在VisualStudio的Windows窗體設計器和Web窗體設計器中找到可視包容。視覺化設計圖面是承載窗體元件(Web窗體中的頁元件)的容器。
封送元件
元件可以是可遠端控制的或不可遠端控制的。可遠端控制的元件由引用或值進行封送。封送涉及跨邊界(如應用程式域(輕量程序)、程序、甚至是計算機)傳送物件。當物件由引用封送時,會建立一個代理對該物件進行遠端呼叫。當物件由值進行封送時,跨相關邊界傳送該物件的一個序列化的副本。
以下可遠端控制的元件應該由引用封送:封裝系統資源的可遠端控制組件,較大的可遠端控制組件或作為單個例項存在的可遠端控制組件。由引用封送的元件的基類是System.ComponentModel.Component。該基類實現IComponent並從MarshalByRefObject派生。.NETFramework類庫中的許多元件從Component派生,包括System.Windows.Forms.Control(Windows窗體控制元件的基類)、System.Web.Services.WebService(使用ASP.NET建立的XMLWeb服務的基類)和System.Timers.Timer(生成遞迴事件的類)。
僅保留狀態的可遠端控制組件應該由值封送。由值封送的元件的基類是System.ComponentModel.MarshalByValueComponent。該基類實現IComponent並從Object派生。.NETFramework類庫中只有少量元件從MarshalByValueComponent派生。所有此類元件都在System.Data名稱空間中(DataColumn、DataSet、DataTable、DataView和DataViewManager)。
按值和按引用封送的物件的基類分別是Object和MarshalByRefObject,但對應的派生類名為MarshalByValueComponent和Component。命名方案背後的邏輯是越常用的型別,其名稱就越簡單。
如果不對元件進行遠端控制,則不要從Component的基實現派生,而應直接實現IComponent。
有關物件遠端控制的更多資訊,請參見.NET遠端處理概述。
控制元件
控制元件是提供(或實現)使用者介面(UI)功能的元件。.NETFramework為控制元件提供兩個基類:一個用於客戶端Windows窗體控制元件,另一個用於ASP.NET伺服器控制元件。它們是System.Windows.Forms.Control和System.Web.UI.Control。.NETFramework類庫中的所有控制元件直接或間接從這兩個類派生。System.Windows.Forms.Control從Component派生,本身提供UI功能。System.Web.UI.Control實現IComponent並提供可在其上輕鬆新增UI功能的基礎結構。
每個控制元件都是一個元件,但並不是每個元件都是控制元件。
在.net環境下編寫WindowsForm控制元件非常的簡單,只要直接和間接繼承與System.Windows.Forms.Control即可,Control類為我們提供了很多高階的特性,如:視窗控制代碼、管理訊息、滑鼠和鍵盤事件、視覺化屬性(Color、Size、Position)、安全和執行緒支援等等,有了這些高階的特性,我們編寫WindowsForm控制元件就簡單的多,同時我們也可以把更多的精力放在我們應該關注的地方,如UI如何畫、資料的Binding和顯示
在.net下編寫WindowsForm控制元件有三種方式,從System.Windows.Forms.Control派生的自定義控制元件、從已有的控制元件派生(如System.Windows.Forms.TextBox)的擴充套件控制元件、從System.Windows.Forms.UserControl派生的組合控制元件,很多的朋友都分不清楚UserControl和Control之間的區別,不知道到底從哪個類進行派生,簡單的說:UserControl比Control更高階,提供了更多的高階特性,Control類只提供控制元件所需的所有基本功能(包括滑鼠和鍵盤處理事件),但不提供視覺化的UI,所以說從Control派生的話,使用者必須overrideOnPaint,UserControl相比Control為我們提供了更多的特性,但是UserControl也就失去了更多的靈活性
元件和控制元件的設計時考慮:
Designer顧名思義就是為Component設計時服務的,Designer可以在設計時修改元件的行為,還可以提供它自己的服務和行為。
在.net裡要為Control或者Component定製Designer,只要從IDesigner繼承下來即可,但是在.net裡ms已經幫我們做了兩個從IDesigner繼承下來的基類,ComponentDesigner和ControlDesigner,ComponentDesigner是為Component而設計的,ControlDesigner是為Control而設計的,所以我們可以直接從ComponentDesigner繼承。
Designer可以提供右鍵快捷選單上的選單命令,我們可以透過實現ComponentDesigner謂詞(Verbs)屬性來定義get訪問器,該訪問器返回的DesignerVerbCollection中包含用於生成選單命令的DesignerVerb物件。同時我們對元件被雙擊時定製預設操作,在ComponentDesigner實現DoDefaultAction方法即可
元件的文件設計器
每個Component不但是有ComponentDesigner,而且還有ComponentDocumentDesigner,但這兩個Designer之間到底有什麼樣的區別呢?我用比較通俗的講法來給大家區別下,ComponentDesigner是指一個Component被拖放到Form或者Page的Container上時所呈現出來的UI設計器(圖1);ComponentDocumentDesigner則是指Component本身根文件設計器(圖2)
12
容器和站點
如果您正在為Windows窗體或Web窗體頁(ASP.NET頁)開發元件和控制元件,則不需要實現容器或站點。Windows窗體和Web窗體的設計器就是Windows窗體和ASP.NET伺服器控制元件的容器。容器向放置在其中的元件和控制元件提供服務。在設計時,控制元件放置在設計器中並從設計器獲得服務。為了保持完整性,以下給出了容器和站點的定義。
Container
容器是一個實現System.ComponentModel.IContainer介面的類,或從實現該介面的類派生的類。容器在邏輯上包含一個或多個元件,這些元件叫做容器的子元件。
Site
站點是一個實現System.ComponentModel.ISite介面的類,或從實現該介面的類派生的類。站點由容器提供,用來管理其子元件及與子元件進行通訊。通常,容器和站點作為一個單元來實現。
元件和控制元件的區別:
1、Component在RunTime時不能呈現UI,而Control可以在RunTime時呈現UI(但是vs2005裡的asp.net中的SqlDataSource是Control,但是它不能呈現UI)。
2、Component是貼在容器Container上的,而Control則是貼在WindowsForm或者WebForm上的。
舉例來說,SqlCommand是個Component,DataGrid則是一個Control。
類:
如果您的類使用外部資源但不用於設計圖面,則實現System.IDisposable,或者從直接或間接實現IDisposable的類派生。
如果您的類要用於設計圖面(如Windows窗體或Web窗體設計器),則實現System.ComponentModel.IComponent,或者從直接或間接實現IComponent的類派生。請注意,IComponent擴充套件IDisposable,因此IComponent型別始終是IDisposable型別。與不是IComponent的IDisposable型別相比,IComponent型別的效能系統開銷要小。但這一不足通常可由在設計時和執行時安置IComponent的能力來彌補。(在本主題的後面部分將對該安置功能進行說明)。
如果希望類可設計(在設計圖面上使用)並且可按引用封送,可從System.ComponentModel.Component派生。Component是按引用封送的IComponent型別的基實現。
如果希望可設計的類可按值封送,可從System.ComponentModel.MarshalByValueComponent派生。MarshalByValueComponent是按值封送的IComponent型別的基實現。
如果希望向物件模型層次中引入IComponent型別,但由於單次繼承的原因而不能從Component或MarshalByValueComponent之類的基派生,請實現IComponent。
如果需要提供使用者介面的可設計類,則該類是控制元件。控制元件必須直接或間接從下列基控制元件類之一派生:System.Windows.Forms.Control或System.Web.UI.Control。
注意
如果您的類既不是可設計類,也不儲存外部資源,則不需要IComponent或IDisposable型別。
下面是元件、控制元件、容器和站點的定義。
元件
在.NETFramework中,元件是指實現System.ComponentModel.IComponent介面的一個類,或從實現IComponent的類中直接或間接派生的類。在程式設計中,“元件”這個術語通常用於可重複使用並且可以和其他物件進行互動的物件。.NETFramework元件滿足這些一般要求,另外還提供諸如控制外部資源和設計時支援等功能。
控制外部資源
IComponent介面擴充套件IDisposable介面,後者在其協定中有一個名為Dispose的方法。在其Dispose方法實現中,元件必須顯式釋放外部資源。與垃圾回收過程中發生的預設、不確定的清理相比,這提供了一個確定的方法來釋放資源。開發人員必須在整個包容層次結構中傳播Dispose以確保元件的子級同時釋放資源。另外,派生的元件必須呼叫其基類的Dispose方法。
注意
即使透過Dispose提供對資源的顯式控制,也應該始終透過終結器(解構函式)提供隱式清理,以防使用者未能對您的元件呼叫Dispose時資源永久洩漏。
下面的示例顯示了在基元件和在派生的元件中實現Dispose的方式。
C#
publicclassBaseComponent:IComponent{
//IComponentextendsIDisposable.
publicvoidDispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protectedvirtualvoidDispose(booldisposing){
if(disposing){
//Freeotherstate(managedobjects).
}
//Freeyourownstate(unmanagedobjects).
}
//SimplycallDispose(false).
~BaseComponent(){
Dispose(false);
}
}
//Derivedcomponent.
publicclassDerivedComponent:BaseComponent{
protectedoverridevoidDispose(booldisposing){
if(disposing){
//Freeotherstate.
}
//YoumustinvoketheDisposemethodofthebaseclass.
base.Dispose(disposing);
//Freeyourownstate.
...
}
//Nofinalizer/destructor.
//NoDispose()method.
}
設計時支援
在.NETFramework中,元件的一個重要功能就是它們是可設計的,這意味著作為元件的類可用於快速應用程式開發(RAD)環境(如VisualStudio)中。可將元件新增到VisualStudio的工具箱中,也可將元件拖放到某個窗體上,還可以在設計圖面上對元件進行操作。請注意,對IComponent型別的基本設計時支援已經內置於.NETFramework中;元件開發人員無須進行額外的工作就可利用基本設計時功能。
有關設計時支援的更多資訊,請參見元件的設計時屬性(Attribute)和擴充套件設計時支援。
承載元件
元件可以被放置(承載)在一個容器(本主題稍後部分進行了定義)中。當元件被放置後,它透過其站點(本主題稍後部分進行了定義)與容器進行互動並能夠透過站點從其容器查詢並得到服務。為了確保容器拆卸後資源被釋放,容器必須實現IDisposable介面。在其Dispose方法的實現中,容器必須釋放它保留的所有資源,並呼叫它包含的每個元件的Dispose方法。
包容是邏輯上的,不需要可視的表示形式。放置資料庫元件的中間層容器就是非可視包容的一個示例。可在VisualStudio的Windows窗體設計器和Web窗體設計器中找到可視包容。視覺化設計圖面是承載窗體元件(Web窗體中的頁元件)的容器。
封送元件
元件可以是可遠端控制的或不可遠端控制的。可遠端控制的元件由引用或值進行封送。封送涉及跨邊界(如應用程式域(輕量程序)、程序、甚至是計算機)傳送物件。當物件由引用封送時,會建立一個代理對該物件進行遠端呼叫。當物件由值進行封送時,跨相關邊界傳送該物件的一個序列化的副本。
以下可遠端控制的元件應該由引用封送:封裝系統資源的可遠端控制組件,較大的可遠端控制組件或作為單個例項存在的可遠端控制組件。由引用封送的元件的基類是System.ComponentModel.Component。該基類實現IComponent並從MarshalByRefObject派生。.NETFramework類庫中的許多元件從Component派生,包括System.Windows.Forms.Control(Windows窗體控制元件的基類)、System.Web.Services.WebService(使用ASP.NET建立的XMLWeb服務的基類)和System.Timers.Timer(生成遞迴事件的類)。
僅保留狀態的可遠端控制組件應該由值封送。由值封送的元件的基類是System.ComponentModel.MarshalByValueComponent。該基類實現IComponent並從Object派生。.NETFramework類庫中只有少量元件從MarshalByValueComponent派生。所有此類元件都在System.Data名稱空間中(DataColumn、DataSet、DataTable、DataView和DataViewManager)。
注意
按值和按引用封送的物件的基類分別是Object和MarshalByRefObject,但對應的派生類名為MarshalByValueComponent和Component。命名方案背後的邏輯是越常用的型別,其名稱就越簡單。
如果不對元件進行遠端控制,則不要從Component的基實現派生,而應直接實現IComponent。
有關物件遠端控制的更多資訊,請參見.NET遠端處理概述。
控制元件
控制元件是提供(或實現)使用者介面(UI)功能的元件。.NETFramework為控制元件提供兩個基類:一個用於客戶端Windows窗體控制元件,另一個用於ASP.NET伺服器控制元件。它們是System.Windows.Forms.Control和System.Web.UI.Control。.NETFramework類庫中的所有控制元件直接或間接從這兩個類派生。System.Windows.Forms.Control從Component派生,本身提供UI功能。System.Web.UI.Control實現IComponent並提供可在其上輕鬆新增UI功能的基礎結構。
注意
每個控制元件都是一個元件,但並不是每個元件都是控制元件。
在.net環境下編寫WindowsForm控制元件非常的簡單,只要直接和間接繼承與System.Windows.Forms.Control即可,Control類為我們提供了很多高階的特性,如:視窗控制代碼、管理訊息、滑鼠和鍵盤事件、視覺化屬性(Color、Size、Position)、安全和執行緒支援等等,有了這些高階的特性,我們編寫WindowsForm控制元件就簡單的多,同時我們也可以把更多的精力放在我們應該關注的地方,如UI如何畫、資料的Binding和顯示
在.net下編寫WindowsForm控制元件有三種方式,從System.Windows.Forms.Control派生的自定義控制元件、從已有的控制元件派生(如System.Windows.Forms.TextBox)的擴充套件控制元件、從System.Windows.Forms.UserControl派生的組合控制元件,很多的朋友都分不清楚UserControl和Control之間的區別,不知道到底從哪個類進行派生,簡單的說:UserControl比Control更高階,提供了更多的高階特性,Control類只提供控制元件所需的所有基本功能(包括滑鼠和鍵盤處理事件),但不提供視覺化的UI,所以說從Control派生的話,使用者必須overrideOnPaint,UserControl相比Control為我們提供了更多的特性,但是UserControl也就失去了更多的靈活性
元件和控制元件的設計時考慮:
Designer顧名思義就是為Component設計時服務的,Designer可以在設計時修改元件的行為,還可以提供它自己的服務和行為。
在.net裡要為Control或者Component定製Designer,只要從IDesigner繼承下來即可,但是在.net裡ms已經幫我們做了兩個從IDesigner繼承下來的基類,ComponentDesigner和ControlDesigner,ComponentDesigner是為Component而設計的,ControlDesigner是為Control而設計的,所以我們可以直接從ComponentDesigner繼承。
Designer可以提供右鍵快捷選單上的選單命令,我們可以透過實現ComponentDesigner謂詞(Verbs)屬性來定義get訪問器,該訪問器返回的DesignerVerbCollection中包含用於生成選單命令的DesignerVerb物件。同時我們對元件被雙擊時定製預設操作,在ComponentDesigner實現DoDefaultAction方法即可
元件的文件設計器
每個Component不但是有ComponentDesigner,而且還有ComponentDocumentDesigner,但這兩個Designer之間到底有什麼樣的區別呢?我用比較通俗的講法來給大家區別下,ComponentDesigner是指一個Component被拖放到Form或者Page的Container上時所呈現出來的UI設計器(圖1);ComponentDocumentDesigner則是指Component本身根文件設計器(圖2)
12
容器和站點
如果您正在為Windows窗體或Web窗體頁(ASP.NET頁)開發元件和控制元件,則不需要實現容器或站點。Windows窗體和Web窗體的設計器就是Windows窗體和ASP.NET伺服器控制元件的容器。容器向放置在其中的元件和控制元件提供服務。在設計時,控制元件放置在設計器中並從設計器獲得服務。為了保持完整性,以下給出了容器和站點的定義。
Container
容器是一個實現System.ComponentModel.IContainer介面的類,或從實現該介面的類派生的類。容器在邏輯上包含一個或多個元件,這些元件叫做容器的子元件。
Site
站點是一個實現System.ComponentModel.ISite介面的類,或從實現該介面的類派生的類。站點由容器提供,用來管理其子元件及與子元件進行通訊。通常,容器和站點作為一個單元來實現。