服务器控件开发(二)

  区分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();

 

 

      如需写入样式和属性,直接在该标签的上方即可!

posted on 2017-07-31 11:06  神奇猪的博客  阅读(180)  评论(0)    收藏  举报