asp.net控件开发基础(4)
来源:百度文库 编辑:神马文学网 时间:2024/04/27 23:09:43
http://www.cnblogs.com/Clingingboy/archive/2006/08/05/468694.html
asp.net控件开发基础(4)
上一篇写了有关回传的一些东西,这次我本来不知道该写什么的,因为各方面的关联太多了,最后我还是想,还是慢慢一点点的写吧.这次讲WebControl
一.从继承WebControl开始
在第二篇教程中,重点介绍了Render()方法的使用,用来呈现控件,但从Control类继承的控件尚未发挥asp.net控件的作用.大家知道web服务器控件分为HTML服务器控件(如这样的形式)和标准服务器控件(就是 这样的形式的控件)
HTML服务器控件的控件从System.Web.UI.HtmlControls.HtmlControl 类派生
标准服务器控件的控件从System.Web.UI.WebControls.WebControl 类派生
HtmlControl 类和WebControl 类则从System.Web.UI.Control 类派生,并扩展.
所以我们说,所有的服务器控件都继承自System.Web.UI.Control 类,即所有的服务器控件都具有Control 类的共同属性,如Visible,EnableViewState属性,HtmlControl 类和WebControl 类则扩充了System.Web.UI.Control 类的功能,如
HtmlControl 类定义了所有 HTML 服务器控件所通用的方法、属性 (Property) 和事件(具体参数参照MSDN)
WebControl 类定义了所有 标准服务器控件所通用的方法、属性 (Property) 和事件(具体参数参照MSDN)
如每个继承了WebControl 类的标准控件都有定义外观和行为的属性,然后不同控件再根据需要扩展功能.
图一
所以我们推荐的做法是直接从WebControl 类派生,而非Control类.我们所做的非并从头开始.从WebControl 类继承可以帮我们省很多工作.
二.重写WebControl类方法,不再是Render()
WebControl类继承了Control类,当然有Render方法,在WebControl类中重写了Render方法,如下代码
示例一
protected override void Render(HtmlTextWriter output)
{
RenderBeginTag(output);
RenderContents(output);
RenderEndTag(output);
}
注意 RebderBeginTag方法并非是HtmlTextWriter类中的方法,而是WebControl类中的方法,表示输出HTML标签头标记,如,RenderEndTag方法则输出HTML标签尾标记,如
.中间的RenderContents方法则就是Control类的Render方法. 看下面RenderContents方法的定义.
示例二
protected override void RenderContents(HtmlTextWriter output){
//使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。
base.Render(output);
}
接着再看RenderBeginTag方法的定义
示例三
public virtual void RenderBeginTag(HtmlTextWriter output)
{
//添加呈现控件的属性和样式
//AddAttributesToRender为WebControl类中的方法
AddAttributesToRender(output);
//呈现控件标签
//如label控件呈现>
//textbox控件呈现>
HtmlTextWriterTag tagKey = TagKey;
if (tagKey != HtmlTextWriterTag.Unknown)
{
output.RenderBeginTag(tagKey);
}
else
{
output.RenderBeginTag(this.TagName);
}
}
这里打个比方,假设你要输出一个表格,你就必须定义标签头,然后在其内部定义
asp.net控件开发基础(4)
上一篇写了有关回传的一些东西,这次我本来不知道该写什么的,因为各方面的关联太多了,最后我还是想,还是慢慢一点点的写吧.这次讲WebControl
一.从继承WebControl开始
在第二篇教程中,重点介绍了Render()方法的使用,用来呈现控件,但从Control类继承的控件尚未发挥asp.net控件的作用.大家知道web服务器控件分为HTML服务器控件(如这样的形式)和标准服务器控件(就是
HTML服务器控件的控件从System.Web.UI.HtmlControls.HtmlControl 类派生
标准服务器控件的控件从System.Web.UI.WebControls.WebControl 类派生
HtmlControl 类和WebControl 类则从System.Web.UI.Control 类派生,并扩展.
所以我们说,所有的服务器控件都继承自System.Web.UI.Control 类,即所有的服务器控件都具有Control 类的共同属性,如Visible,EnableViewState属性,HtmlControl 类和WebControl 类则扩充了System.Web.UI.Control 类的功能,如
HtmlControl 类定义了所有 HTML 服务器控件所通用的方法、属性 (Property) 和事件(具体参数参照MSDN)
WebControl 类定义了所有 标准服务器控件所通用的方法、属性 (Property) 和事件(具体参数参照MSDN)
如每个继承了WebControl 类的标准控件都有定义外观和行为的属性,然后不同控件再根据需要扩展功能.
图一
所以我们推荐的做法是直接从WebControl 类派生,而非Control类.我们所做的非并从头开始.从WebControl 类继承可以帮我们省很多工作.
二.重写WebControl类方法,不再是Render()
WebControl类继承了Control类,当然有Render方法,在WebControl类中重写了Render方法,如下代码
示例一
protected override void Render(HtmlTextWriter output)
{
RenderBeginTag(output);
RenderContents(output);
RenderEndTag(output);
}
注意 RebderBeginTag方法并非是HtmlTextWriter类中的方法,而是WebControl类中的方法,表示输出HTML标签头标记,如
示例二
protected override void RenderContents(HtmlTextWriter output){
//使用默认逻辑来呈现子控件,那么一定要调用基类中的方法。
base.Render(output);
}
接着再看RenderBeginTag方法的定义
示例三
public virtual void RenderBeginTag(HtmlTextWriter output)
{
//添加呈现控件的属性和样式
//AddAttributesToRender为WebControl类中的方法
AddAttributesToRender(output);
//呈现控件标签
//如label控件呈现>
//textbox控件呈现>
HtmlTextWriterTag tagKey = TagKey;
if (tagKey != HtmlTextWriterTag.Unknown)
{
output.RenderBeginTag(tagKey);
}
else
{
output.RenderBeginTag(this.TagName);
}
}
这里打个比方,假设你要输出一个表格,你就必须定义
,下面看Control类中Render方法的实现,表明Render方法必须完成所有的任务,包括标签头标记
|