WEBTIMER控件研究的心得:WebTimer的启示

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

None.gif using  System;
None.gif
using  System.Web.UI;
None.gif
using  System.Web;
None.gif
None.gif
None.gif
namespace  MyControl
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
public class WebTimer:System.Web.UI.Control
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
public WebTimer()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}
问题是,这个CONTROL没有任何用途,它既不会向页面产生输出,也不会处理事件,几乎没有任何用途
另外,为什么继承CONTROL类而不是WEBCONTROL类,在<深入剖析ASP.NET组件设计>中讲的很清楚,WEBTIMER是不需要产生可视的HTML代码的,它所需要的是绘制一段JS代码到页面中去,所以,无需继承复杂的WEBCONTROL,而是继承CONTROL
既然是计时器,WEBTIMER当然需要设置每隔多少时间进行一次计时了,另外,我们还加入一个开头允许使用者打开或者关闭此计时器,所以,我们为WEBTIMER加入以下成员变量和属性
ContractedBlock.gif ExpandedBlockStart.gif 成员变量定义 #region 成员变量定义
InBlock.gif            
private int _interval=5000;//计时器种子数
InBlock.gif
            private bool _enable=true;//是否允许此计时器
InBlock.gif
            private static  object TimerKey=new object();//TimerKey是做什么用的呢,它是用来做Events的KEY对象的,而且它是静态的,所以,对于类的所有实例,将只耗费一个变量的代价
ExpandedBlockEnd.gif
        #endregion

None.gif
ContractedBlock.gifExpandedBlockStart.gif        
属性定义 #region 属性定义
InBlock.gif        [Browsable(
true),Bindable(true),DefaultValue(5000),Description("计时器使用的种子数")]
InBlock.gif        
public int Interval
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
setdot.gif{_interval=value;}
ExpandedSubBlockStart.gifContractedSubBlock.gif            
getdot.gif{return(_interval);}
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [Browsable(
true),Bindable(true),DefaultValue(true),Description("是否允许计时器")]
InBlock.gif        
public bool Enable
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
getdot.gif{return _enable;}
ExpandedSubBlockStart.gifContractedSubBlock.gif            
setdot.gif{_enable=true;}
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        [Browsable(
true),Bindable(true),DefaultValue(true),Description("是否输出控件")]
InBlock.gif        
public override bool Visible
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{return base.Visible;}
InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{base.Visible = value;}
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedBlockEnd.gif        
#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的代码
ContractedBlock.gif ExpandedBlockStart.gif IPostBackEventHandler 成员 #region IPostBackEventHandler 成员
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 每个要使用POSTBACK机制并且想在POSTBACK后进行适当处理的控件
InBlock.gif        
/// 必须实现IPostBackEventHandler的RaisePostBackEvent方法
InBlock.gif        
/// 并在此方法中调用或间接调用事件处理程序
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <param name="eventArgument"></param>

InBlock.gif        public void RaisePostBackEvent(string eventArgument)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
// TODO:  添加 WebTimer.RaisePostBackEvent 实现
InBlock.gif
            ProcessTimer("");
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif        
#endregion

None.gif

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

转载于:https://www.cnblogs.com/Heroman/archive/2004/11/30/70911.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值