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()
{
}
}
}
using System.Web.UI;
using System.Web;
namespace MyControl
{
public class WebTimer:System.Web.UI.Control
{
public WebTimer()
{
}
}
}
另外,为什么继承CONTROL类而不是WEBCONTROL类,在<深入剖析ASP.NET组件设计>中讲的很清楚,WEBTIMER是不需要产生可视的HTML代码的,它所需要的是绘制一段JS代码到页面中去,所以,无需继承复杂的WEBCONTROL,而是继承CONTROL
既然是计时器,WEBTIMER当然需要设置每隔多少时间进行一次计时了,另外,我们还加入一个开头允许使用者打开或者关闭此计时器,所以,我们为WEBTIMER加入以下成员变量和属性
成员变量定义
#region 成员变量定义
private int _interval=5000;//计时器种子数
private bool _enable=true;//是否允许此计时器
private static object TimerKey=new object();//TimerKey是做什么用的呢,它是用来做Events的KEY对象的,而且它是静态的,所以,对于类的所有实例,将只耗费一个变量的代价
#endregion
属性定义 #region 属性定义
[Browsable(true),Bindable(true),DefaultValue(5000),Description("计时器使用的种子数")]
public int Interval
{
set{_interval=value;}
get{return(_interval);}
}
[Browsable(true),Bindable(true),DefaultValue(true),Description("是否允许计时器")]
public bool Enable
{
get{return _enable;}
set{_enable=true;}
}
[Browsable(true),Bindable(true),DefaultValue(true),Description("是否输出控件")]
public override bool Visible
{
get
{return base.Visible;}
set
{base.Visible = value;}
}
#endregion
private int _interval=5000;//计时器种子数
private bool _enable=true;//是否允许此计时器
private static object TimerKey=new object();//TimerKey是做什么用的呢,它是用来做Events的KEY对象的,而且它是静态的,所以,对于类的所有实例,将只耗费一个变量的代价
#endregion
属性定义 #region 属性定义
[Browsable(true),Bindable(true),DefaultValue(5000),Description("计时器使用的种子数")]
public int Interval
{
set{_interval=value;}
get{return(_interval);}
}
[Browsable(true),Bindable(true),DefaultValue(true),Description("是否允许计时器")]
public bool Enable
{
get{return _enable;}
set{_enable=true;}
}
[Browsable(true),Bindable(true),DefaultValue(true),Description("是否输出控件")]
public override bool Visible
{
get
{return base.Visible;}
set
{base.Visible = value;}
}
#endregion
上面定义了_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 成员
#region IPostBackEventHandler 成员
/**//// <summary>
/// 每个要使用POSTBACK机制并且想在POSTBACK后进行适当处理的控件
/// 必须实现IPostBackEventHandler的RaisePostBackEvent方法
/// 并在此方法中调用或间接调用事件处理程序
/// </summary>
/// <param name="eventArgument"></param>
public void RaisePostBackEvent(string eventArgument)
{
// TODO: 添加 WebTimer.RaisePostBackEvent 实现
ProcessTimer("");
}
#endregion
/**//// <summary>
/// 每个要使用POSTBACK机制并且想在POSTBACK后进行适当处理的控件
/// 必须实现IPostBackEventHandler的RaisePostBackEvent方法
/// 并在此方法中调用或间接调用事件处理程序
/// </summary>
/// <param name="eventArgument"></param>
public void RaisePostBackEvent(string eventArgument)
{
// TODO: 添加 WebTimer.RaisePostBackEvent 实现
ProcessTimer("");
}
#endregion
ProcessTimer是一个私有的成员方法,作用是调用合适的事件处理方法