1. 程式人生 > >.net自定義控制元件Control、WebControl、CompositeControl

.net自定義控制元件Control、WebControl、CompositeControl

一、呈現方法

1、Control主要有以下4個方法用於呈現

 1 //該方法為入口方法
 2 public virtual void RenderControl (HtmlTextWriter writer)   
 3 {        
 4   this.RenderControl(writer,this.xxxAdapter);   
 5 }   
 6  
 7 protected void RenderControl(HtmlTextWriter writer, ControlAdapter adapter)   
 8 {
 9   if (adapter != null
) 10 { 11 //呼叫相關的介面卡方法 12 } 13 else 14 { 15 this.Render(writer); 16 } 17 } 18 19 protected internal virtual void Render(HtmlTextWriter writer) 20 { 21 this.RenderChildren(); 22 } 23 24 protected internal virtual void RenderChildren(HtmlTextWriter writer) 25 { 26 //呈現子控制元件 27
} 28 29 /* 30 整個呈現順序就是: 31 1.RenderControl(HtmlTextWriter writer) 32 2.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) 33 3.Render(HtmlTextWriter writer) 34 4.RenderChildren(HtmlTextWriter writer) 35 */

2、WebControl在Control的基礎上增加了Style,呈現方面就是在Render(HtmlTextWriter writer) 方法中擴充套件了三個呈現方法,增加一個屬性呈現方法。

 1 protected override void Render(HtmlTextWriter writer)  
 2 {          
 3   this.RenderBeginTag(writer);  
 4   this.RenderContents(writer);  
 5   this.RenderEndTag(writer);  
 6 } 
 7  
 8 public virtual void RenderBeginTag  (HtmlTextWriter writer)  
 9 {  
10   this.AddAttributesToRender(writer);  
11   //呈現Tag開始標記 
12 }      
13   
14 protected internal virtual void RenderContents  (HtmlTextWriter writer)  
15 {  
16   //呼叫Control的呈現  
17   base.Render(writer);  
18 }   
19   
20 public virtual void RenderEndTag(HtmlTextWriter writer)  
21 {  
22   //呈現結束標記  
23 }   
24   
25 protected virtual void AddAttributesToRender  (HtmlTextWriter writer)  
26 {  
27   //呈現Attribute 
28 } 

3、CompositeControl重寫了WebControl的Render (HtmlTextWriterwriter),增加了設計時支援以建立子控制元件

1 protected internal override void Render(HtmlTextWriterwriter)  
2 {  
3   //如果在設計時,建立子控制元件,也就是在設計時增加友好體驗  
4   if(DesignMode)  
5     this.EnsureChildControls();  
6   base.Render(writer);  
7 }

二、自定義控制元件常用的特性

1、命名控制元件特性
① [assembly: TagPrefix("Samples.AspNet", "myControls")]   //指定@Register指令中的tagprefix值,Samples.AspNet是名稱空間


2、控制元件特性
① [DefaultProperty("Text")]      //開啟IDE屬性視窗時預設選中的屬性項
② [ToolboxData("<{0}:myCustomControl runat=server></{0}:myCustomControl>")]   //從工具箱拖放控制元件生成的預設標記,可以加上其它想預設顯示的屬性


3、屬性特性
① [Bindable(true)]                //設定該屬性是否支援繫結
② [DefaultValue("")]              //屬性的預設值(如果在IDE屬性欄裡輸入的值與該值相同,IDE中的這個值不變黑)。顯示的預設值則要在建構函式裡賦值。
③ [Localizable(true)]             //屬性是否支援本地化
④ [Browsable(true)]               //該項屬性是否會顯示在控制元件的“屬性”視窗中
⑤ [Description("顯示的文字")]     //屬性的說明
⑥ [Category("Appearance")]        //屬性分組的類別名稱,可以是自定義的值
   Action:“操作”組
   Appearance:“外觀”組
   Behavior:“行為 ”組
   Data:“資料”組
   Default:“雜項”組
   Design:“設計”組
   DragDrop:“拖放”組
   Focus:“焦點”組
   Format:“格式”組
   Key:“鍵盤”組
   Layout:“佈局”組
   Mouse:“滑鼠”組
   WindowStyle:“視窗樣式”組
⑦ [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  //指定屬性是否在網頁的原始碼中顯示
    DesignerSerializationVisibility.Hidden   //在程式碼生成器中不生成屬性程式碼,在aspx的原始檔中將看不到此屬性
    DesignerSerializationVisibility.Visible  //在程式碼生成器中生成屬性程式碼
    DesignerSerializationVisibility.Content  //在程式碼生成器中生成的是屬性內容的程式碼,而不是屬性本身的程式碼。隻影響aspx中的程式碼生成器中顯示的屬性。
⑧ [TypeConverter(typeof(ExpandableObjectConverter))]  //將類屬性在IDE屬性視窗顯示出摺疊
⑨ [NotifyParentProperty(true)]   //是否將屬性視窗中對子屬性的修改上傳到物件模型,並在被修改了的子屬性的控制元件中產生修改通知。

(列舉屬性,類屬性)

 

三、自定義控制元件在web.config中註冊

 1 <configuration>
 2   <system.web>    
 3     <pages>
 4       <controls>
 5         <add tagPrefix="scottgu" src="~/Controls/Header.ascx" tagName="header"/>
 6         <add tagPrefix="scottgu" src="~/Controls/Footer.ascx" tagName="footer"/>
 7         <add tagPrefix="ControlVendor" assembly="ControlVendorAssembly"/>
 8       </controls>
 9     </pages>
10   </system.web>
11 </configuration>