区分Control类和WebControl类:
服务器控件可以继承自这两个类;
探究这个两个类的区别,以及这两个类分别适用在哪种情况!
本文的学习过程中,使用到的类库为ControlLibrary,这个类库可以自己命名;
单标签---继承自Control类的SimpleControl控件:类库中新建一个SimpleControl类
using System; using System.Web; using System.Web.UI; namespace ControlLibrary {
//继承Control类 public class SimpleControl:Control {
//重载Render方法 protected override void Render(HtmlTextWriter writer) {
//调用HtmlTextWriter的Write方法,向页面写入内容 writer.Write("This is my first Control"); } } }
单标签---继承自WebControl类的SimpleWebControl;类库中新建一个SimpleWebControl类
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ControlLibrary { public class SimpleWebControl:WebControl { private int _number; public int Number { get { return _number; } set { _number = value; } }
//默认标签为<span> protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; } } protected override void RenderContents(System.Web.UI.HtmlTextWriter writer) { writer.Write("This is my first WebControl"); writer.Write("<br>"); writer.Write("this WebControl property is Number"); writer.Write("<br>"); writer.Write("this Number is :"); writer.Write(Number); } } }
多标签---继承自Control,新建一个ComplexControl类:
using System; using System.Web; using System.Web.UI; namespace ControlLibrary { public class ComplexControl:Control { private string _name; public string Name { get { return _name; } set { _name = value; } } //确定此控件没有子控件 protected override ControlCollection CreateControlCollection() { return new EmptyControlCollection(this); } protected override void Render(HtmlTextWriter writer) {
· //如果要对一个标签写入样式、属性等,只需在该标签的上面写入即可 writer.AddAttribute(HtmlTextWriterAttribute.Id,this.UniqueID); writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor,"red"); writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle,"solid"); writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "1px"); writer.RenderBeginTag(HtmlTextWriterTag.Table); writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("请输入用户名"); writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Name,"Username"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("请输入密码"); writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Name, "Password"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Type,"button"); writer.AddAttribute(HtmlTextWriterAttribute.Value,"登录"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderEndTag();//table } } }
多标签---继承自WebControl,新建一个ComplexWebControl
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ControlLibrary { public class ComplexWebControl:WebControl { private string _name; public string Name { get { return _name; } set { _name = value; } } //确定此控件没有子控件 protected override ControlCollection CreateControlCollection() { return new EmptyControlCollection(this); }
//重写默认标签<span> protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Table; } }
//重载AddAttributesToRender方法,继承WebControl自带样式属性,然后新增其他属性 protected override void AddAttributesToRender(HtmlTextWriter writer) { base.AddAttributesToRender(writer); writer.AddAttribute(HtmlTextWriterAttribute.Id,this.UniqueID); } protected override void RenderContents(HtmlTextWriter writer) { writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("请输入用户名"); writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Name, "Username"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write("请输入密码"); writer.RenderEndTag();//td writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Name, "Password"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr writer.RenderBeginTag(HtmlTextWriterTag.Tr); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Type, "button"); writer.AddAttribute(HtmlTextWriterAttribute.Value, "登录"); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag();//input writer.RenderEndTag();//td writer.RenderEndTag();//tr } } }
4个控件-页面代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebSite.Default" %> //服务器注册 <%@ Register TagPrefix="nsp" Namespace="ControlLibrary" Assembly="ControlLibrary" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" href="Style/Site.css" type="text/css" /> <title></title> </head> <body> <nsp:SimpleControl runat="server"/> <br/> <nsp:SimpleWebControl runat="server"/> <br/> <nsp:ComplexControl runat="server"/> <br/> <nsp:ComplexWebControl runat="server"/> </body> </html>
总结:
HtmlControl和WebControl都是Control的子类;WebControl和Control都可以进行控件的开发。
Control开发过程:
1、编写属性和方法
2、重载CreateControlCollection,确定没有子控件
3、重载Render方法,通过HtmlTextWriter的方法写入标签、标签样式、标签属性
WebControl开发过程:
1、编写属性和方法
2、重载CreateControlCollection,确定没有子控件
3、重载TagKey方法来重写默认标签<span>,将<span>标签改为<table>标签
4、重载AddAttributesToRender方法继承默认样式属性,以及添加新的样式属性。这些属性和样式都是<table> 标签的
5、重载RenderContents方法,向标签里写入子标签和方法
在大多数的服务器控件开发中,往往继承WebControl,因为它自己带有样式属性,直接继承就行!
如果通过HtmlTextWriter写入标签、标签和属性?
HtmlTextWriter.AddAttribute();写入属性
HtmlTextWriter.AddStyleAttribute();写入样式
HtmlTextWriter.RenderBeginTag(); 写入标签,每个标签比带有一个结束标签
HtmlTextWriter.RenderEndTag();
如需写入样式和属性,直接在该标签的上方即可!
浙公网安备 33010602011771号