转自:https://blog.csdn.net/wogeiniziyou/article/details/7564830?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-1.nonecase
在我们的项目开发中,由于ASP.NET的服务器控件功能有限,所以我们经常会自己定义特定的服务器控件,来满足开发中特定的业务要求。可见知道如何开发ASP.NET服务器控件是非常有必要的。
其实简单的实现ASP.NET服务器控件不是很难,以前园子中也有大牛介绍过相应的内容,这里站在巨人的肩膀上也来分享下开发ASP.NET服务器控件的方法和自己的一些体会。写给新手,高手绕过。
学习ASP.NET的服务器控件开发,个人认为最好的方式就是自己去实践,当然理论知识也是很重要的,但是如果我们只是看理论的知识,可能会被里面的一些概念闹糊涂,看着看着就睡着了,如果自己动手创做出一个自己的控件,效果就不一样了。
下面就通过实例创建一个简单的服务器控件:
首先我们创建一个类库工程SelfWebControl。在同一解决方案中我们在创建一个ASP,NET Web应用程序(用来测试我们得控件)
namespace SelfWebControl { public class ControlA:Control//Control类中定义了所有ASP.NET服务器控件共享的属性和方法 { } }
我将ControlA类继承Control类,Control类是.NET中所有控件的基类,其中包含了控件共有的属性和方法。
上传递。
OnDataBinding 引发 DataBinding 事件。
OnInit 引发 Init 事件。
OnLoad 引发 Load 事件。
OnPreRender 引发 PreRender 事件。
OnUnload 引发 Unload 事件。 注意 在服务器控件生存期的此阶段,服务器控件应执行所有最后的清理操作,例如关闭文件、关闭数据库连接和丢弃对象。
RaiseBubbleEvent 将所有事件源及其信息分配给控件的父级。
Render 将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
RenderChildren 将服务器控件子级的内容输出到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
SaveViewState 保存自页回发到服务器后发生的任何服务器控件视图状态更改。
TrackViewState 导致跟踪服务器控件的视图状态的更改,以便这些更改可以存储到服务器控件的 StateBag 对象中。通过 Control.ViewState 属性可访问此对象。
这里我们要重写Render方法,通过HtmlTextWriter 对象将控件中的内容显示出去。
namespace SelfWebControl { public class ControlA:Control//Control类中定义了所有ASP.NET服务器控件共享的属性和方法 { protected override void Render(HtmlTextWriter writer) { writer.Write("<table style='width:300px; height:200px; "); writer.Write("<tr>"); writer.Write("<td>这是第一列</td>"); writer.Write("<td>这是第二列</td>"); writer.Write("<td>这是第三列</td>"); writer.Write("</tr>"); writer.Write("</table>"); } } }
生成我们得SelfWebControl工程,再切换到ASP.NET应用程序的工具箱时,VS2008会自动的将我们刚刚创建的ControlA添加到工具箱中,避免了我们以前通过选择项添加控件的过程。
这样,我们就已最简单的形式实现了一个ASP.NET服务器控件。但是如果我想修改表格的宽度,高度,背景色该怎么改呢?
这就需要我们定义服务器控件的属性。大家也都知道,ASP.NET的服务器控件有很多属性,而我们现在的控件只有公有的几个属性。
先来看看我们做了那些改动:
public class ControlA:Control//Control类中定义了所有ASP.NET服务器控件共享的属性和方法 { private int _tWidth; private int _tHeight; private string _bgColor; [Browsable(true)]//在属性窗口中是否可见 [Category("Appearance")]//属性的分类,如,行为,外观,大家可以在属性窗口看见这样的分类 [DefaultValue(100)]//属性的默认值 [Description("表格宽度")]//这些是显示在属性窗口底下的 public int tWidth { get { return _tWidth; } set { _tWidth = value; } } [Browsable(true)] [Category("Appearance")] [DefaultValue(100)] [Description("表格高度")] public int tHeight { get { return _tHeight; } set { _tHeight = value; } } [Browsable(true)] [Category("Appearance")] [DefaultValue("Bisque")] [Description("表格背景颜色")] public string bgColor { get { return _bgColor; } set { _bgColor = value; } } protected override void Render(HtmlTextWriter writer) { writer.Write("<table style='width:" + tWidth + "px; height:"+tHeight+"px; outline: 0px; margin: 0px; padding: 0px; color: rgb(80, 161, 79); overflow-wrap: break-word;">"'>"); writer.Write("<tr>"); writer.Write("<td>这是第一列</td>"); writer.Write("<td>这是第二列</td>"); writer.Write("<td>这是第三列</td>"); writer.Write("</tr>"); writer.Write("</table>"); } }
代码很简单,想必大家都能看懂,值得注意的就是对每一个属性的声明。需要引用命名空间:using System.ComponentModel;每一个标签的作用我已经在代码中做了说明,这样我们就为我们得控件添加了属性.
还要说明一点的就是,如果我们想在把控件拖到页面中时标签内自动的添加一些属性,需要添加下面的代码:
[ToolboxData("<{0}:ControlA runat='server' bgColor='red' tHeight='200' tWidth='300'></{0}:ControlA>")]
值得注意的是这里的写法,{0}的冒号中之后的那个"ControlA“就是类的名字,不要写错。还有runat='sever'一定要写。
是不是很简单,这样,我们只是封装了简单的html来完成ASP.NET控件的制作。
小结:简单的制作一个ASP.NET的服务器控件很简单,但是光只是通过html的输出有的时候意义不大,这里只是介绍一种方法和思路。打开学习定制自己的ASP.NET控件的第一扇门。在以后的文章中我会介绍针对于继承WebControl开发ASP.NET控件。