编写自定义控件首先要选择基类。
1.所有的标准控件都可以作为基类。你可以选择你需要的标准控件来重写新的控件
2.如果从标准控件找不到适合的基类,则可以使用以下三种中的一种
a)System.Web.UI.Control(所有ASP.NET控件的基类)
b)System.Web.UI.WebControls.WebControl(继承自a)
c)System.Web.UI.WebControls.CompositeControl(继承自b)
一:Control的呈现方法
Control是通过重写它的Render()方法来实现呈现的。
Render方法的声明:
Code protected internal vitrual void
Render(HtmlTextWrite output) { //todo }
protected和virtual二个Attribute得存在,所以继承于Control的类可以重写Render方法来实现自己的呈现逻辑。
internal这个Attribute使得该方法只能在ASP.NET框架中直接调用,而不能在其他代码中直接调用。
1.HelloWorld
来个最简单的,就是在页面上呈现一句话:HelloWorld
Code using System; using
System.Collections.Generic; using System.Text; using System.Web.UI; namespace
HelloWorld { /**//// <summary> ///
HelloWorld自定义控件 /// </summary>
public class HelloWorld:System.Web.UI.Control {
protected override void
Render(HtmlTextWriter writer) {
writer.WriteLine("HelloWorld"); }
} }
注意事项:
a)当我们把他添加到页面的时候,IDE会自动添加这样一句代码
Code <%@ Register assembly="HelloWorld"
namespace="HelloWorld" tagprefix="cc1" %>
TagPrefix属性是声明控件前缀,IDE默认是ccl,当然我们可以自己来定义为自己喜欢的。(最好不要改成asp,免得和标准控件混淆)
自定义TagPreFix有2种方法:
一种是在ASPX页面中修改,这样只会影响当前页面的。而不能修改整个项目。
另一种自然是修改整个项目的,需要在web.config文件中修改,在System.web下加上下面一段代码
Code
<pages> <controls>
<add
assembly="HelloWorld" namespace="HelloWord" tagPrefix="Sky"/>
</controls>
</pages> 2.Login
我们可以通过Render()方法中的writeLine方法来输出一行行的代码,但是这样比较复杂也容易出错。所以我们还可以HtmlTextWrite
得三个其他方法来更方便的帮组我们向页面添加Html代码。HtmlTextWriteTag(表示Html标签),HtmlTextWriteAttribute(表示HTML
标签的属性),HtmlTextWriteStyle(标示HTML标签的样式).
为了和上面的直接输入比较我们对比下面两段代码:
Code protected override void
Render(HtmlTextWriter writer) {
writer.WriteLine(@"<div>用户名 <input");
writer.WriteLine(@"style=""font-size: 12px; color: #0000FF; text-decoration:
blink; width:100px;"" type=""text"" /><br />");
writer.WriteLine(@"密 码 ");
writer.WriteLine(@"<input style=""background-color: #FF00FF; width:100px;""
type=""password"" /></div>");
}
Code
protected override void
Render(HtmlTextWriter writer) {
//开始最外层的Div
writer.RenderBeginTag(HtmlTextWriterTag.Div);
//添加文字
writer.WriteLine("用户名 ");
//添加用户名登录框样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "0000FF");
writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "blink");
//开始用户名登录框
writer.RenderBeginTag(HtmlTextWriterTag.Input);
//添加换行符号
writer.RenderBeginTag(HtmlTextWriterTag.Br);
//结束换行符号
writer.RenderEndTag();
//添加密码文字
writer.WriteLine("密 码 ");
//结束用户名登录框
writer.RenderEndTag();
//添加密码登录框样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Type, "password");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#FF00FF");
//开始密码登录框
writer.RenderBeginTag(HtmlTextWriterTag.Input);
//结束密码登录框
writer.RenderEndTag();
//结束最外层Div
writer.RenderEndTag();
}
二者呈现的内容是一样的但是第二种第一种书写更有层次感。
在第二段代码中要注意的是书写顺序,要先书写属性和样式,然后在书写标签(就是在调用书写标签的BeginTag之前)。
同时如果要写的样式在HtmlTextWriteAttribut枚举中没有,我们可以直接来写如:
write.AddStyleAttribute("alt","你好");
二:WebControl的呈现方法
由于WebControl继承自Control所以他的呈现方法只是对Control方法的改进和扩展。
他把Render()方法一分为三:WebControl.RenderBeginTag()(最外层标签)、WebControl.RenderContents()(页面中标签中内容)、
WebControl.RenderEndTag()(最外层结束标签).
其中,
WebControl.RenderBeginTag()方法所产生的Html标签有WebControl.TagKey或WebControl.TagName属性决定的。
TagKey是HtmlTextWriteTag的枚举值,如果没有这个枚举值,则设置TagKey为Unkown并且设置TagName(String类型).
如果你需要给最外层标签添加属性则可以重写WebControl.AddAttributesToRender()方法
一般我们不重写WebControl.RenderBeginTag()方法而是重写Tagkey或者TagName属性来实现对最外层标签的控制。
Code //重写TagKey添加最外层标签
protected override
System.Web.UI.HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Div;
}
}
//重写RenerContents
protected override void
RenderContents(HtmlTextWriter writer)
{ //添加文字
writer.WriteLine("用户名 ");
//添加用户名登录框样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "0000FF");
writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "blink");
//开始用户名登录框
writer.RenderBeginTag(HtmlTextWriterTag.Input);
//添加换行符号
writer.RenderBeginTag(HtmlTextWriterTag.Br);
//结束换行符号
writer.RenderEndTag();
//添加密码文字
writer.WriteLine("密 码 ");
//结束用户名登录框
writer.RenderEndTag();
//添加密码登录框样式和属性
writer.AddAttribute(HtmlTextWriterAttribute.Type, "password");
writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px");
writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#FF00FF");
//开始密码登录框
writer.RenderBeginTag(HtmlTextWriterTag.Input);
//结束密码登录框
writer.RenderEndTag(); }
三:CompositeControl的呈现方法(暂时)