第一章 .Net 控件开发(WebForm) 开发简单自定义控件(5) 继承WebControl类

 1、我们建一个类叫TestControl2,继承WebControl,重写RenderContents方法,增加了几个属性,以便后面有用到。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebFormControl
{
    public class TestControl2:WebControl
    {
        /// <summary>
        /// 将控件的内容呈现到指定的编写器中。此方法主要由控件开发人员使用。
        /// </summary>
        /// <param name="writer">System.Web.UI.HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流</param>
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "50px");
            writer.AddAttribute(HtmlTextWriterAttribute.Border, "1"); //由于样式里没有Border属性我们将在后面自定义的时候讲到
            writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "3");
            writer.RenderBeginTag(HtmlTextWriterTag.Table);
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(NameLable);
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, NameId);
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            writer.AddAttribute(HtmlTextWriterAttribute.Name, NameName);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, ShowNameId); 
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
            writer.AddAttribute(HtmlTextWriterAttribute.Value, ShowNameLable);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, ShowNameName);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            //writer.RenderEndTag();
            base.RenderContents(writer);
        }
        /// <summary>
        /// Name的id
        /// </summary>
        protected virtual string NameId
        {
            get { return "Txt_Name"; }
        }
        /// <summary>
        /// Name的name
        /// </summary>
        protected virtual string NameName
        {
            get { return "Txt_Name"; }
        }

        protected virtual string ShowNameId
        {
            get { return "Btn_Show"; }
        }

        protected virtual string ShowNameName
        {
            get { return "Btn_Show"; }
        }
        /// <summary>
        /// Name的值
        /// </summary>
        public virtual string NameLable
        {
            get
            {
                return ViewState["NameLable"] != null ? (string)ViewState["NameLable"] : "姓名";
            }
            set
            {
                ViewState["NameLable"] = value;
            }
        }

        public virtual string ShowNameLable
        {
            get
            {
                return ViewState["ShowNameLable"] != null ? (string)ViewState["ShowNameLable"] : "显示";
            }
            set
            {
                ViewState["ShowNameLable"] = value;
            }
        }
    }
}

2、将控件放到网页上显示,会看到这样HTML源码

 <span id="TestControl21"><table border="1" cellpadding="2" cellspacing="3" style="height:50px;">
	<tr>
		<td>姓名</td><td><input id="Txt_Name" type="text" name="Txt_Name" /></td>
	</tr><tr>
		<td colspan="2" align="center"><input id="Btn_Show" type="submit" value="显示" name="Btn_Show" /></td>
	</tr>
</table>


3、我们在类里面根本没写span标签怎么在Html源码中怎么会有呢?因为我们默认最外层的元素就是span,换言之,我们上章末尾提到的3个块的其中两个RenderBeginTag和RenderEndTag方法生成了Html元素span的打开了关闭标记,然而,WebControl类没有将最外层元素的Htmlspan进行硬编码,相反,该类公开了个属性TagKey,我们只要重写这个属性就可以了,将最外层设置为Table,再对CreateControlStyle方法修改,让CreateControlStyle返回TableStyle对象,然后对RenderContents方法修改,再增加几个表格属性的属性

 protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Table;
            }
        }

 

 protected override Style CreateControlStyle()
        {
            return new TableStyle(ViewState);//控件与ControlStyle共享ViewState
            //return base.CreateControlStyle();
        }


 

 /// <summary>
        /// 将控件的内容呈现到指定的编写器中。此方法主要由控件开发人员使用。
        /// </summary>
        /// <param name="writer">System.Web.UI.HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流</param>
        protected override void RenderContents(HtmlTextWriter writer)
        {
            /*注释掉和表格有关的属性,把这些属性设置成属性
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "50px");
            writer.AddAttribute(HtmlTextWriterAttribute.Border, "1"); //由于样式里没有Border属性我们将在后面自定义的时候讲到
            writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing, "3");
            writer.RenderBeginTag(HtmlTextWriterTag.Table);
            */
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write(NameLable);
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, NameId);
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            writer.AddAttribute(HtmlTextWriterAttribute.Name, NameName);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2");
            writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.AddAttribute(HtmlTextWriterAttribute.Id, ShowNameId); 
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit");
            writer.AddAttribute(HtmlTextWriterAttribute.Value, ShowNameLable);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, ShowNameName);
            writer.RenderBeginTag(HtmlTextWriterTag.Input);
            writer.RenderEndTag();
            writer.RenderEndTag();
            writer.RenderEndTag();
            //writer.RenderEndTag();
            base.RenderContents(writer);
        }

 

 public virtual int CellSpacing
        {
            get { return ((TableStyle)ControlStyle).CellSpacing; }
            set { ((TableStyle)ControlStyle).CellSpacing = value; }
        }

        public virtual int CellPadding
        {
            get { return ((TableStyle)ControlStyle).CellPadding; }
            set { ((TableStyle)ControlStyle).CellPadding = value; }
        }


4、把改好的再编译下,拖到页面上看下的源码,没有span标签了

<table id="TestControl21">
	<tr>
		<td>姓名</td><td><input id="Txt_Name" type="text" name="Txt_Name" /></td>
	</tr><tr>
		<td colspan="2" align="center"><input id="Btn_Show" type="submit" value="显示" name="Btn_Show" /></td>
	</tr>
</table>

 代码下载地址:点击下载 

本博客内容有些来源于网络或书籍如果侵害到你的权益,请及时联系我(hch458458@vip.qq.com)
版权归nethch所有,转载请注明出处!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值