五:理解控件的运行机制(例:基于Control命名空间的简单控件)
一:先用最简短的话说点理论的
1.asp.net中所有的标准控件都可以重写
2.和控件相关的命名空间有
System.Web.UI.Control
是所有控件的基类
只提供简单的呈现逻辑,不支持样式表
System.Web.UI.WebControls.WebControl
继承自Control
支持控件外观
System.Web.UI.WebControls.CompositeControl
继承自WebControl类
派生出多个控件合成的复合控件
3.控件树的实现原理
首先Page类本身就是一个控件,它继承自Control
所有的控件都有一个Render方法
这个方法负责把控件的内容发送给请求者
在Render方法中会调用一个RenderChildren方法
RenderChildren方法触发所有子控件的生成行为
子控件又有Render方法
子子孙孙无穷尽也...
这就实现了控件树
二开始看例子
建立一个工程
在工程下建立一个类库
其中有一个类,继承自Control类
注意类库要引用web名称空间
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
namespace hellowControl
{
public class HellowControl:Control
{
protected override void Render(HtmlTextWriter writer)
{
//要先写div的样式
writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "center");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "180px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "180px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "1px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, "solid");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, "grey");
//再写div开始标签
writer.RenderBeginTag(HtmlTextWriterTag.Div);
//开始写div里的内容,是一个图片
//先写图片的样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Src, "noimage_s.jpg");
writer.AddStyleAttribute(HtmlTextWriterStyle.Margin, "8px");
//写image标签开始
writer.RenderBeginTag(HtmlTextWriterTag.Img);
//闭合image标签
writer.RenderEndTag();
//闭合div标签
writer.RenderEndTag();
}
}
}
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
namespace hellowControl
{
public class HellowControl:Control
{
protected override void Render(HtmlTextWriter writer)
{
//要先写div的样式
writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "center");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "180px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "180px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth, "1px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle, "solid");
writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor, "grey");
//再写div开始标签
writer.RenderBeginTag(HtmlTextWriterTag.Div);
//开始写div里的内容,是一个图片
//先写图片的样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Src, "noimage_s.jpg");
writer.AddStyleAttribute(HtmlTextWriterStyle.Margin, "8px");
//写image标签开始
writer.RenderBeginTag(HtmlTextWriterTag.Img);
//闭合image标签
writer.RenderEndTag();
//闭合div标签
writer.RenderEndTag();
}
}
}
个人感觉这个逻辑有点怪异
除了这些也不多说了
然后生成这个类库
你将得到一个dll文件
在你的工具箱中点右键>>>选择项
浏览找到刚才的dll
然后你会发现,你的工具箱里多了一个控件
拖到你的页面就能使用了
这里注意writer.WriteBeginTag()等方法
和writer.RenderBeginTag()是有区别的