ASP.NET的组件有两种,一种是继承自Control或者Webcontrol的CONTROL类组件,这类组件当你把它拖入到页面上时,它显示在页面上,另一种继承自Component类,这种不会显示在页面布局上,而是显示在COMPONENT TRAY上,这种,你可以叫它不可视组件,比如Sqlconnection组件
要实现一个CONTROL类的控件,只要有下面的核心代码就行了

using System;
using System.Web.UI;
using System.Web;


namespace MyControl
{
public class WebTimer:System.Web.UI.Control
{
public WebTimer()
{
}

}

}
问题是,这个CONTROL没有任何用途,它既不会向页面产生输出,也不会处理事件,几乎没有任何用途
另外,为什么继承CONTROL类而不是WEBCONTROL类,在<深入剖析ASP.NET组件设计>中讲的很清楚,WEBTIMER是不需要产生可视的HTML代码的,它所需要的是绘制一段JS代码到页面中去,所以,无需继承复杂的WEBCONTROL,而是继承CONTROL
既然是计时器,WEBTIMER当然需要设置每隔多少时间进行一次计时了,另外,我们还加入一个开头允许使用者打开或者关闭此计时器,所以,我们为WEBTIMER加入以下成员变量和属性
成员变量定义

        
属性定义

上面定义了_interval成员变量,暴露了一个对应的Interval属性,而_enable成员变量的暴露属性为Enable,用属性的好处是组件在设计时,属性可以显示于属性栏用来通过IDE进行设计,另外我们还对属性添加了一些修饰,[]内的是对成员进行修饰的Attribute
其中Browsable是定义此成员是否可以在IDE设计器中用BIND对话框来添加绑定,DefaultValue定义其默认值,当指定值与默认值相吻合时,此属性不被写入以减少代码,DESCRIPTION是显示于IDE的说明
这里BROWSABLE也好,BINDABLE也好,其全称应该是BrowsableAttribute,BindableAttribute,Browsable是其别名,它们是派生于Attribute类,作用是用来通告使用者一些信息
构成WEBTIMER的成员要素齐备了,接着呢?WEBTIMER的作用是要让页面每隔一段时间就POSTBACK,然后再引发事件,从而在事件处理函数中做一些处理,问题是,怎样才能让WEBTIMER能够处理事件呢,答案是继承IPostBackEventHandler接口,SYSTEM命名空间中有N多的接口,其中IPostBackEventHandler是给那些需要参与POSTBACK机制,并且在回传后处理事件的控件来用的,为什么呢,因为回传后,PAGE会调用RaisePostBackEvent来处理回传事件,在处理事件时,Page会调用页面中每一个实现了IpostbackEventHandler接口的控件的RaisePostBackEvent方法来处理事件,因此,要参与POSTBACK的事件处理,不光要实现IPOSTBACKEVENTHANDLER,而且要实现RaisePostBackEvent方法,VS.NET很方便,所以,当你加入IPostBackEventHandler接口的时候,它会提示你按TAB键来重载IPostBackEventHandler.RaisePostBackEvent方法,VS.NET会为你自动加入代码
下面是实现IPostBackEventHandler.RaisePostBackEvent的代码
IPostBackEventHandler 成员

ProcessTimer是一个私有的成员方法,作用是调用合适的事件处理方法