自定义控件(3)HtmlTextWriter

来源:互联网 发布:mysql排序规则 编辑:程序博客网 时间:2024/06/05 10:12

在前面的一片文章中我定义了一个HelloWorld控件,代码如下

using System.Web.UI;namespace kjlx.BLL.HelloWorld{    //继承自Control    public class HelloWorld : Control    {        //Render,呈现,Control就是通过这一方法来输出内容的.        protected override void Render(HtmlTextWriter writer)        {            writer.WriteLine("Hello World!");        }    }}
这个控件功能很简单,就是显示HelloWorld,不过不知道大家有没有注意控件到底是怎么在网页上输出"HelloWorld"的。

我们看一下代码

HtmlTextWriter writerwriter.WriteLine("Hello World!");

从代码中不难看出,控件是用HtmlTextWriter生成内容的。

下面我们就来学习一下HtmlTextWriter(参考http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html)

HtmlTextWriter在控件制作中发挥重要作用,能够帮助我快速生成html语句

1.HtmlTextWriter初始化

HtmlTextWriter的构造函数要求必须传递一个与TextWriter接口兼容的实例。大家可以根据需要选择合适的TextWriter接口实现类,因为该类的选择将决定最终生成的Html文本的输出方式,例如我想把结果输出到一个TextBox中,于是我就使用了StringWriter类的实例作为参数传入: 

   StringWriter sw=new System.IO.StringWriter();    HtmlTextWriter writer=new HtmlTextWriter(sw); 
如果要获得结果,只需要使用sw.toString()就可以了。注意,HtmlTextWriter本身不提供输出方法或属性。

注意:不知道各位在上面的例子中看到writer.WriteLine的时候有没有和Response.Write联系在一起,把WriteLine方法当成在网页上输出内容。反正我刚开始学的时候一直是这么认为的。之后深入学习才知道HtmlTextWriter是没有输出方法的,它的作用是快速生成HTML,生成的html保存在sw中。下面我写个小实例。

第一个实例代码

using System;using System.IO;using System.Web.UI;public partial class HtmlTextWriterTest : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        Response.Write("程序开始</br>");        StringWriter sw = new System.IO.StringWriter();        HtmlTextWriter writer=new HtmlTextWriter(sw);        writer.Write("我是HtmlTextWriter</br>");        Response.Write("程序结束");    }}
运行结果



第二个实例代码

using System;using System.IO;using System.Web.UI;public partial class HtmlTextWriterTest : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        Response.Write("程序开始</br>");        StringWriter sw = new System.IO.StringWriter();                   HtmlTextWriter writer=new HtmlTextWriter(sw);                    writer.Write("我是HtmlTextWriter</br>");        Response.Write(sw);        Response.Write("程序结束");    }}

运行结果


从上面两个例子可以很清楚的知道,HtmlTextWriter的WriteLine方法并没有输出内容,而是生成内容,把内容保持到sw中。当我们输出sw时就能在页面上看到我们刚才生成的内容.

2.HtmlTextWriter常用方法

(1)RenderBeginTag(HtmlTextWriterTag tagKey) 和RenderEndTag() 

RenderBeginTag方法创建HTML开始标签<div>

RenderEndTag方法创建HTML结束标签</div>

RenderEndTag创建的结束标签与离它最近的开始标签匹配

实例代码

using System;using System.IO;using System.Web.UI;public partial class HtmlTextWriterTest : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        StringWriter sw = new System.IO.StringWriter();        HtmlTextWriter writer = new HtmlTextWriter(sw);           writer.RenderBeginTag(HtmlTextWriterTag.Div);    //DIV开始标签        writer.RenderBeginTag(HtmlTextWriterTag.Span);   //span开始标签        writer.RenderEndTag();                           //span结束标签        pre1.InnerText = sw.ToString();        writer.RenderEndTag();                           //DIV结束标签        pre2.InnerText = sw.ToString();    }}
页面显示



(2)AddAttribute:用于添加标签的属性,例如<img>标签的url属性、width属性等。使用该方法时要注意一点,AddAttribute语句必须出现在对应的RenderBeginTag的前面,请看下面的例子: 

using System;using System.IO;using System.Web.UI;public partial class HtmlTextWriterTest : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        StringWriter sw = new System.IO.StringWriter();        HtmlTextWriter writer = new HtmlTextWriter(sw);         writer.AddAttribute("url", "../xxx.gif");        writer.AddAttribute("width", "50");        writer.AddAttribute("height", "50");        writer.RenderBeginTag(HtmlTextWriterTag.Img);        writer.RenderEndTag();        pre1.InnerText = sw.ToString();        Response.Write(sw.ToString());    }}
显示结果: