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

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

產生 bsp 順序 contents hidden nvi 增加 register ora

一、呈現方法

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> 

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