asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

asp.net 控件开发(一)显示控件内容


发布日期:2020年01月24日
 
asp.net 控件开发(一)显示控件内容

控件的显示自然会离不开输出htmlcssjavascript等前台的显示内容所以开发一个控件的时候第一件事就是要知道如何输出客户端要显示的内容

选择基类

中所有的标准控件都可以拿过来作为基类如果我们要开发的控件只是对原有的标准控件做一些功能上的加强的话(如你对TreeView的CheckBox添加一些随动的功能)就可以直接拿标准控件过来作为基类

一般的如果开发的控件从标准里面找不到合适的可以从三个类中来继承

SystemWebUIControl

SystemWebUIWebControlsWebControl

SystemWebUIWebControlsCompositeControl

下面介绍下这三个类的关系跟区别

Control:只提供简单的呈现没有对css的支持Literal控件

WebControl:建立了对控件外观的支持适合可视化的控件来继承 Button

CompositeControl:是派生多个控件复合的适合开发应用中的标准控件

三者的关系Control是所有控件的基类 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)

{

writerWriteLine(Henllo World);

}

}

编译之后在新的项目中添加对dll文件的使用会呈现出Hello World

Control输出html内容

在Render方法中我们要实现输出html标签跟样式可以借助于HtmlTextWriterTagHtmlTextWriterAttributeHtmlTextWriterStyle这三个枚举来实现HtmlTextWriterTag是表示Html标签HtmlTextWriterAttribute是表示标签上的属性HtmlTextWriterStyle是表示样式

Picture示例

public class PicShow : Control

{

protected override void Render(HtmlTextWriter writer)

{

writerAddStyleAttribute(HtmlTextWriterStyleTextAlign center);

writerAddStyleAttribute(HtmlTextWriterStyleHeight px);

writerAddStyleAttribute(HtmlTextWriterStyleWidth px);

writerRenderBeginTag(HtmlTextWriterTagDiv);

//Create Img Tag

writerAddAttribute(HtmlTextWriterAttributeSrc 你的图片地址);

writerAddStyleAttribute(HtmlTextWriterStyleWidth px);

writerAddStyleAttribute(HtmlTextWriterStyleHeight px);

writerRenderBeginTag(HtmlTextWriterTagImg);

writerRenderEndTag();

//End Of Div

writerRenderEndTag();

}

}

当你指定好上面的图片地址后就可以显示出指定的图片同过查看源文件我们可以发现客户端生成的源代码就是我们所要创建的html内容

WebControl的呈现

WebControl的呈现分为三步呈现开始标签呈现标签中的内容呈现结束标签分别实现的方法为RenderBeginTagRenderContentsRenderEndTagRenderBeginTag所生成的标签是有WebControlTagKey或则WebControlTagName属性来决定的WebControlTagKey的默认呈现标签为<span>所以如果我们要改变刚开始的呈现标签可以通过重写WebControlTagKey或则WebControlTagName来实现

注意的就是通常我们要对外围的标签进行控制时我们不会去重写RenderBeginTag方法而是去重写TagKey属性另外如果我们重写了RenderBeginTag方法就一定要去重写RenderEndTag方法

另外WebControl提供了AddAttributeToRender方法来添加控件的属性需要注意的一点你重写AddAttributeToRender方法添加属性时也要去调用baseAddAttributeToRender方法

我们用WebControl来实现上面的PicShow控件

public class PictureWeb : WebControl

{

protected override HtmlTextWriterTag TagKey

{

get

{

return HtmlTextWriterTagDiv;

}

}

protected override void AddAttributesToRender(HtmlTextWriter writer)

{

baseAddAttributesToRender(writer);

writerAddStyleAttribute(HtmlTextWriterStyleTextAlign center);

writerAddStyleAttribute(HtmlTextWriterStyleWidth px);

writerAddStyleAttribute(HtmlTextWriterStyleHeight px);

}

protected override void RenderContents(HtmlTextWriter writer)

{

writerAddAttribute(HtmlTextWriterAttributeSrc你的图片地址);

writerAddStyleAttribute(HtmlTextWriterStyleWidth px);

writerAddStyleAttribute(HtmlTextWriterStyleHeight px);

writerRenderBeginTag(HtmlTextWriterTagImg);

writerRenderEndTag();

}

}

在上面的代码中我们首先要创建div标签所以修改TagKey属性为了给外层的div添加属性所以重写了AddAttributesToRender方法最后在呈现的Img在RenderContents方法中实现创建外层的<div>跟结束的</div>我们交给了RenderBeginTag跟RenderEndTag去实现而无需重写

CompositeControl的呈现

因为CompositeControl继承于WebControl所以也有属性TagKey来决定开始的标签我们要实现CompositeControl的呈现只需添加域即可以如我们的控件需要有TextBox控件可以表示为private TextBox _txtInput然后通过重写CreateChildControls方法通过thisControlsAdd方法来呈现

上一篇:Asp.NET自定义DataGrid控件

下一篇:十个ASP.NET基础知识问答