呈现控件内容 继承Control、WebControl、CompositeControl的不同
2009-04-03 11:48
459 查看
asp.net控件的显示自然会离不开输出HTML、CSS、Javascript等前台的显示内容,所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容
因为控件最终是生存在ASP.NET框架中的,他必须有一个能融合在ASP.NET框架中的基类。
一、选择基类
首先,我们说ASP.NET中所有的标准控件都是可以拿来做基类的,所以,如果你的控件只是对某个标准控件做少量的修改或补充,那么你大可把这个标准控件拿来做基类。一般的如果开发的控件从标准里面找不到合适的,可以从三个类中来继承:
System.Web.UI.Control
System.Web.UI.WebControls.WebControl
System.Web.UI.WebControls.CompositeControl
下面介绍下这三个类的关系跟区别:
Control:只提供简单的呈现,没有对css的支持。如:Literal控件
WebControl:建立了对控件外观的支持。适合可视化的控件来继承 ,如:Button
CompositeControl:是派生多个控件复合的。适合开发应用asp.net中的标准控件。
三者的关系:Control是asp.net所有控件的基类 ,
WebControl是从Control中继承而来,
CompositeControl是从WebControl中继承而来(是ASP.NET2.0中新增的类)。
虽然三个基类各有所长,但我们不能忘记了他们之间的继承关系,所以接下来我们从Control 类开始分析控件的呈现行为。
二、如何呈现
1、Control的呈现
Control类中的呈现是通过方法Render来实现的。Render的原型:
protected internal virtual void Render(HtmlTextWriter writer){
}
HtmlTextWriter writer 参数是在运行时有调用Render方法的框架所提供,所以我们可以同过重写Render方法来实现内容的呈现。
public class HelloWorld : Control{
protected override void Render(HtmlTextWriter writer)
{
writer.WriteLine("Hello World");
}
}
在Render方法中我们要实现输出html标签跟样式可以借助于:HtmlTextWriterTag、 HtmlTextWriterAttribute、HtmlTextWriterStyle这三个枚举来实现。HtmlTextWriterTag是表示 Html标签,HtmlTextWriterAttribute是表示标签上的属性,HtmlTextWriterStyle是表示样式
在上面的代码中,我们只需要负责写好呈现的逻辑就行了,什么时候调用呈现,怎么调用,以及怎么准备HtmlTextWriter实例是ASP.NET运行时操心的事情。
2、Render() 是怎样被调用的
Page间接继承自Control类,Control的RenderControl()方法默认逻辑为判断Control.Visible 属性,如果为TRUE,则调用Control.Render()方法,Render方法
默认逻辑为生成自己的内容和调用RenderControl()方法触发所有的子控件(如果有的话)的生成行为,而子控件也将按同样的顺序调用RenderControl(),Render(),并调用RenderChildren()方法触发子控件的子控件的生成行为,如此一级级递归下去,就使控件树全部生成。
3、WebControl的呈现
WebControl的呈现分为三步:呈现开始标签、呈现标签中的内容、呈现结束标签,分别实现的方法为:RenderBeginTag、RenderContents、RenderEndTag。RenderBeginTag所生成的标签是有WebControl.TagKey或则WebControl.TagName属性来决定的。WebControl.TagKey的默认呈现标签为<span>,所以如果我们要改变刚开始的呈现标签可以通过重写WebControl.TagKey或则WebControl.TagName来实现。
注意的就是通常我们要对外围的标签进行控制时我们不会去重写RenderBeginTag方法,而是去重写TagKey属性。另外如果我们重写了RenderBeginTag方法就一定要去重写RenderEndTag方法。
另外WebControl提供了AddAttributeToRender方法来添加控件的属性。需要注意的一点你重写AddAttributeToRender方法添加属性时,也要去调用base.AddAttributeToRender方法。
WebControl类是对Control.Render()的化整为零。
4、CompositeControl的呈现
因为CompositeControl继承于WebControl所以也有属性TagKey来决定开始的标签。我们要实现CompositeControl的呈现只需添加域即可以,如我们的控件需要有TextBox控件可以表示为:private TextBox _txtInput。然后通过重写CreateChildControls方法,通过this.Controls.Add方法来呈现。
因为控件最终是生存在ASP.NET框架中的,他必须有一个能融合在ASP.NET框架中的基类。
一、选择基类
首先,我们说ASP.NET中所有的标准控件都是可以拿来做基类的,所以,如果你的控件只是对某个标准控件做少量的修改或补充,那么你大可把这个标准控件拿来做基类。一般的如果开发的控件从标准里面找不到合适的,可以从三个类中来继承:
System.Web.UI.Control
System.Web.UI.WebControls.WebControl
System.Web.UI.WebControls.CompositeControl
下面介绍下这三个类的关系跟区别:
Control:只提供简单的呈现,没有对css的支持。如:Literal控件
WebControl:建立了对控件外观的支持。适合可视化的控件来继承 ,如:Button
CompositeControl:是派生多个控件复合的。适合开发应用asp.net中的标准控件。
三者的关系:Control是asp.net所有控件的基类 ,
WebControl是从Control中继承而来,
CompositeControl是从WebControl中继承而来(是ASP.NET2.0中新增的类)。
虽然三个基类各有所长,但我们不能忘记了他们之间的继承关系,所以接下来我们从Control 类开始分析控件的呈现行为。
二、如何呈现
1、Control的呈现
Control类中的呈现是通过方法Render来实现的。Render的原型:
protected internal virtual void Render(HtmlTextWriter writer){
}
HtmlTextWriter writer 参数是在运行时有调用Render方法的框架所提供,所以我们可以同过重写Render方法来实现内容的呈现。
public class HelloWorld : Control{
protected override void Render(HtmlTextWriter writer)
{
writer.WriteLine("Hello World");
}
}
在Render方法中我们要实现输出html标签跟样式可以借助于:HtmlTextWriterTag、 HtmlTextWriterAttribute、HtmlTextWriterStyle这三个枚举来实现。HtmlTextWriterTag是表示 Html标签,HtmlTextWriterAttribute是表示标签上的属性,HtmlTextWriterStyle是表示样式
在上面的代码中,我们只需要负责写好呈现的逻辑就行了,什么时候调用呈现,怎么调用,以及怎么准备HtmlTextWriter实例是ASP.NET运行时操心的事情。
2、Render() 是怎样被调用的
Page间接继承自Control类,Control的RenderControl()方法默认逻辑为判断Control.Visible 属性,如果为TRUE,则调用Control.Render()方法,Render方法
默认逻辑为生成自己的内容和调用RenderControl()方法触发所有的子控件(如果有的话)的生成行为,而子控件也将按同样的顺序调用RenderControl(),Render(),并调用RenderChildren()方法触发子控件的子控件的生成行为,如此一级级递归下去,就使控件树全部生成。
3、WebControl的呈现
WebControl的呈现分为三步:呈现开始标签、呈现标签中的内容、呈现结束标签,分别实现的方法为:RenderBeginTag、RenderContents、RenderEndTag。RenderBeginTag所生成的标签是有WebControl.TagKey或则WebControl.TagName属性来决定的。WebControl.TagKey的默认呈现标签为<span>,所以如果我们要改变刚开始的呈现标签可以通过重写WebControl.TagKey或则WebControl.TagName来实现。
注意的就是通常我们要对外围的标签进行控制时我们不会去重写RenderBeginTag方法,而是去重写TagKey属性。另外如果我们重写了RenderBeginTag方法就一定要去重写RenderEndTag方法。
另外WebControl提供了AddAttributeToRender方法来添加控件的属性。需要注意的一点你重写AddAttributeToRender方法添加属性时,也要去调用base.AddAttributeToRender方法。
WebControl类是对Control.Render()的化整为零。
4、CompositeControl的呈现
因为CompositeControl继承于WebControl所以也有属性TagKey来决定开始的标签。我们要实现CompositeControl的呈现只需添加域即可以,如我们的控件需要有TextBox控件可以表示为:private TextBox _txtInput。然后通过重写CreateChildControls方法,通过this.Controls.Add方法来呈现。
相关文章推荐
- 呈现控件内容 继承Control、WebControl、CompositeControl的不同
- 呈现控件内容 继承Control、WebControl、CompositeControl的不同
- 呈现控件内容 继承Control、WebControl、CompositeControl的不同
- 呈现控件内容 继承Control、WebControl、CompositeControl的不同
- 创建继承自System.Web.UI.WebControls.WebControl基类的控件类
- [ASP.NET 控件实作 Day16] 继承 WebControl 实作 Toolbar 控件
- [导入][ASP.NET 控件实作 Day16] 继承 WebControl 实作 Toolbar 控件
- ASP.NET控件开发学习笔记--第7回 从WebControl继承
- #380 – Frame控件可以显示网页内容(The Frame Control Can Host Web Content)
- 继承Control、WebControl、CompositeControl的不同(转)
- 第二篇:呈现内容_第二节:WebControl呈现
- 重新想象 Windows 8 Store Apps (15) - 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState, VisualStateManager
- Web Control开发随笔(2):ASP.NET 控件生命周期
- List Control控件的内容导出到text文档
- Asp.Net Web控件 (八)(TabControl 选项卡控件)
- MFC中使用Tab Control从CTabCtrl控件类继承自己的类(CTabSheet)来处理。
- net控件中数据导到Excel的格式 首先,我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果cell没有规定的格式,则excel会以默认的格式去呈现该cell的数据。这样就给我们提供了自定义数据格式的空间,当然我们必须使用excel支持的格式。下面就列出常用的一些格式: 1) 文本
- 自定义WebControl:广告控件
- [WPF - 之一问一答系列] 如何从WPF的WebBrowser控件中获得WebResponse内容?为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null?
- web.config中的<globalization >标签在将几个不同服务器上的网闸内容以统一面貌集成在自己网站上时的要考虑的问题