首页 / 网页编程 / ASP.NET / ASP.NET服务器控件之RenderContents
        
            ASP.NET服务器控件之RenderContents2011-03-19 天极开发 金属边缘上一篇文章介绍了使用Control类的Render方法实现控件呈现的基本知识和示例应用。本文重点介绍另一种实现控件呈现的常用方法--使用WebControl类的RenderContents方法实现控件呈现。基础知识就服务器控件而言只存在两种情况:一种是具有外观可视化元素的控件,还有一种是不具有外观可视化元素的控件。如果需要开发的服务器控件包含可视化元素,那么多数情况下,建议开发人员创建继承自System.Web.UI.WebControls.WebControl基类的控件类。这种做法的主要原因是基于便捷性考虑。因为,WebControl类可提供服务器控件的部分与外观有关的公共属性、方法和事件等。通过该类定义的属性,可以控制服务器控件的外观和行为。例如,使用BackColor和ForeColor属性,可以分别控制服务器控件的背景色和前景颜色;在可以显示边框的控件上,可以通过设置BorderWidth、BorderStyle和BorderColor属性,控制边框宽度、边框样式和边框颜色;服务器控件的大小可以通过Height和Width属性来指定等等。如果控件基类是Control类,那么实现这些类似内容则非常繁琐。在使用WebControl基类实现控件呈现的过程中,必然要使用该类所提供的属性和方法等成员对象。这是读者需要重点掌握的内容。另外,对于该基类的构造函数也是不容忽视的。下面首先从WebControl的构造函数开始入手进行讲解,随后将说明常见的成员对象。WebControl类包括三个构造函数,它们都用于初始化WebControl类的新实例,然而它们之间还存在一些细小的差异。(1)protected WebControl ()该构造函数用于初始化表示Span HTML元素的WebControl类的新实例。通常情况下,开发人员并不直接调用此构造函数。相反,它通常由派生类的构造函数调用以将TagKey属性初始化为Span枚举值。在随后的示例中,将重写TagKey属性,从而调用此构造函数。(2)public WebControl (HtmlTextWriterTag tag)开发人员可使用此构造函数创建并初始化使用指定的System.Web.UI.HtmlTextWriterTag值的WebControl类的新实例。其中的参数tag表示HtmlTextWriterTag枚举值之一。可能读者对于HtmlTextWriterTag还不太熟悉。它是一个枚举类型,其枚举值多为HTML标记,例如,A、B、Bold、Button等等。(3)protected WebControl (string tag)使用此构造函数可创建并初始化使用指定的HTML标记的WebControl类的新实例。其中参数tag表示HTML标记。当使用该构造函数时一定要注意:不能直接调用此构造函数。相反,它通常由派生类的构造函数调用以初始化TagKey和TagName属性。在了解了WebControl类的构造函数之后,读者还必须了解WebControl类的一些常用属性和方法。下面列举了这些常用成员对象,它们对于实现控件呈现有着重要意义。(1)Attributes属性该属性用于获取与控件的属性不对应的任意特性(只用于呈现)的集合,其属性类型为AttributeCollection。(2)ControlStyle属性该属性用于获取服务器控件的样式,它是Style类型。ControlStyle属性封装WebControl类的所有外观属性,如BorderColor和Font。(3)TagKey属性该属性用于获取与此服务器控件相对应的System.Web.UI.HtmlTextWriterTag值,其属性类型为HtmlTextWriterTag枚举。(4)protected virtual void AddAttributeToRender(HtmlTextWriter writer);该方法将需要呈现的HTML属性和样式添加到指定的System.Web.UI.HtmlTextWriter中。注意在重写过程中,一定要调用基类中相应的方法。(5)public void ApplyStyle(Style s);该方法将指定样式的所有非空白元素复制到控件,改写控件的所有现有的样式元素。(6)public void MergeStyle(Style s);该方法将指定样式的所有非空白元素复制到控件,但不改写该控件现有的任何样式元素。(7)protected override void Render(HtmlTextWriter writer);方法该方法重写了Control.Render。