/*********************************************
文件名:WebTimer.cs
编写者:懒豆
编写日期:2007-8-1
简要描述:简单的测试用的页面定时控件
********************************************/
using System;
using System.Web.UI;
using System.Text;
using System.Web;
using System.Data;
using System.ComponentModel;
namespace MyControl
{
/** <summary>
/// WebTimer 的摘要说明。
/// </summary>
///Designer属性指定一个类作为设计时类,该类必须派生于ControlDesigner类,并且实现GetDesignHtml方法
///Designer性性是System.ComponentModel空间的类
///WebTimer继承了IPostBackEventHandler是因为任何要利用POSTBACK机制来进行事件处理的控件都必须
///继承该接口并实现RaisePostbackEvent方法
[Designer(typeof(MyControl.WebTimerDesigner))]
public class WebTimer:System.Web.UI.Control,System.Web.UI.IPostBackEventHandler
{
#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
#region 事件定义
public event EventHandler Timer
{
add {Events.AddHandler(TimerKey,value);}
remove{Events.RemoveHandler(TimerKey,value);}
}
#endregion
#region 方法定义
/** <summary>
/// 这个私有方法是用来在引发POSTBACK事件后,调用事件处理的关键,它再调用相应的事件处理程序
/// </summary>
private void ProcessTimer(string eventArgument)
{
EventHandler TimerHandler=(EventHandler)Events[TimerKey];
if(TimerHandler!=null)
TimerHandler(this,EventArgs.Empty);
}
private string BuildJavascript()
{
StringBuilder JsBuilder=new StringBuilder();
JsBuilder.AppendFormat("<script language='javascript'>setTimeout(\"{0}\",{1});</script>",new object[]{Page.GetPostBackEventReference(this),Interval});
return(JsBuilder.ToString());
}
#endregion
#region IPostBackEventHandler 成员
/** <summary>
/// 每个要使用POSTBACK机制并且想在POSTBACK后进行适当处理的控件
/// 必须实现IPostBackEventHandler的RaisePostBackEvent方法
/// 并在此方法中调用或间接调用事件处理程序
/// </summary>
/// <param name="eventArgument"></param>
public void RaisePostBackEvent(string eventArgument)
{
// TODO: 添加 WebTimer.RaisePostBackEvent 实现
ProcessTimer("");
}
#endregion
#region OnRender方法用来输出HTML
protected override void Render(HtmlTextWriter writer)
{
if(Page!=null)
Page.VerifyRenderingInServerForm(this);
if(_enable)
writer.Write(BuildJavascript());
}
#endregion
#region OnPreRender方法用来产生HTML
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender (e);
//Page.GetPostBackEventReference(this,"");
//发现这一句可以不加,如果见了的话呢,DOPOSTBACK将会被绘制在前面,否则,绘制在后面
}
#endregion
}
}