.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>
.net自定義控件Control、WebControl、CompositeControl