.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> 
posted @ 2019-07-09 14:31  DarJeely  阅读(303)  评论(0编辑  收藏  举报