来源:http://it.hywxfashion.cn/p/c/2008/05/15/ca0e79af-3c98-4052-8912-18768fa84ab7.shtml
asp.net控件的显示自然会离不开输出html、css、javascript等前台的显示内容,所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容。
一、选择基类
asp.net中所有的标准控件都可以拿过来作为基类,如果我们要开发的控件只是对原有的标准控件做一些功能上的加强的话(如:你对treeview的checkbox添加一些随动的功能),就可以直接拿标准控件过来作为基类。
一般的如果开发的控件从标准里面找不到合适的,可以从三个类中来继承:
system.web.ui.control
system.web.ui.webcontrols.webcontrol
system.web.ui.webcontrols.compositecontrol
下面介绍下这三个类的关系跟区别:
control:只提供简单的呈现,没有对css的支持。如:literal控件
webcontrol:建立了对控件外观的支持。适合可视化的控件来继承 ,如:button
compositecontrol:是派生多个控件复合的。适合开发应用asp.net中的标准控件。
三者的关系:control是asp.net所有控件的基类 ,webcontrol是从control中继承而来,compositecontrol是从webcontrol中继承而来。
二、如何呈现
control的呈现
control类中的呈现是通过方法render来实现的。render的原型:
protected internal virtual void render(htmltextwriter writer){...}
htmltextwriter writer 参数是在运行时有调用render方法的框架所提供,所以我们可以同过重写render方法来实现内容的呈现。
helloworld示例:
public class helloworld : control{
protected override void render(htmltextwriter writer)
{
writer.writeline("henllo world");
}
}
编译之后,在新的项目中添加对dll文件的使用,会呈现出"hello world"。
control输出html内容
在render方法中我们要实现输出html标签跟样式可以借助于:htmltextwritertag、 htmltextwriterattribute、htmltextwriterstyle这三个枚举来实现。htmltextwritertag是表示 html标签,htmltextwriterattribute是表示标签上的属性,htmltextwriterstyle是表示样式。
picture示例:
public class picshow : control { protected override void render(htmltextwriter writer) { writer.addstyleattribute(htmltextwriterstyle.textalign, "center"); writer.addstyleattribute(htmltextwriterstyle.height, "100px"); writer.addstyleattribute(htmltextwriterstyle.width, "100px"); writer.renderbegintag(htmltextwritertag.div); //create img tag writer.addattribute(htmltextwriterattribute.src, "你的图片地址"); writer.addstyleattribute(htmltextwriterstyle.width, "80px"); writer.addstyleattribute(htmltextwriterstyle.height, "80px"); writer.renderbegintag(htmltextwritertag.img); writer.renderendtag(); //end of div writer.renderendtag(); } }
当你指定好上面的图片地址后,就可以显示出指定的图片。同过查看源文件我们可以发现客户端生成的源代码就是我们所要创建的html内容。
webcontrol的呈现
webcontrol的呈现分为三步:呈现开始标签、呈现标签中的内容、呈现结束标签,分别实现的方法为:renderbegintag、 rendercontents、renderendtag。renderbegintag所生成的标签是有webcontrol.tagkey或则 webcontrol.tagname属性来决定的。webcontrol.tagkey的默认呈现标签为,所以如果我们要改变刚开始的呈现标签可以通过重写webcontrol.tagkey或则webcontrol.tagname来实现。
注意的就是通常我们要对外围的标签进行控制时我们不会去重写renderbegintag方法,而是去重写tagkey属性。另外如果我们重写了renderbegintag方法就一定要去重写renderendtag方法。
另外webcontrol提供了addattributetorender方法来添加控件的属性。需要注意的一点你重写addattributetorender方法添加属性时,也要去调用base.addattributetorender方法。
我们用webcontrol来实现上面的picshow控件:
public class pictureweb : webcontrol { protected override htmltextwritertag tagkey { get { return htmltextwritertag.div; } } protected override void addattributestorender(htmltextwriter writer) { base.addattributestorender(writer); writer.addstyleattribute(htmltextwriterstyle.textalign, "center"); writer.addstyleattribute(htmltextwriterstyle.width, "100px"); writer.addstyleattribute(htmltextwriterstyle.height, "100px"); } protected override void rendercontents(htmltextwriter writer) { writer.addattribute(htmltextwriterattribute.src,"你的图片地址"); writer.addstyleattribute(htmltextwriterstyle.width, "80px"); writer.addstyleattribute(htmltextwriterstyle.height, "80px"); writer.renderbegintag(htmltextwritertag.img); writer.renderendtag(); } }
在上面的代码中我们首先要创建div标签,所以修改tagkey属性,为了给外层的div添加属性所以重写了 addattributestorender方法,最后在呈现的img在rendercontents方法中实现。创建外层的< div >跟结束的< /div >我们交给了renderbegintag跟renderendtag去实现而无需重写。
compositecontrol的呈现
因为compositecontrol继承于webcontrol所以也有属性tagkey来决定开始的标签。我们要实现 compositecontrol的呈现只需添加域即可以,如我们的控件需要有textbox控件可以表示为:private textbox _txtinput。然后通过重写createchildcontrols方法,通过this.controls.add方法来呈现。