ExtAspNet应用技巧(二十) - 如何创建ext:Timer控件

原创|其它|编辑:郝浩|2009-09-17 11:01:30.000|阅读 767 次

概述:在刚刚发布的ExtAspNet v2.1.1版本中,应网友要求添加了ext:Timer控件,实现的效果就是定时回发(AJAX)到服务器执行一段C#代码。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

引子

在刚刚发布的ExtAspNet v2.1.1版本中,应网友要求添加了ext:Timer控件,实现的效果就是定时回发(AJAX)到服务器执行一段C#代码。
因为这个控件非常简单,没有页面可视元素,所以我就单独拿出来讲解一下,或许对大家阅读ExtAspNet源代码有一定的帮助。


使用Timer控件

先来看下使用Timer的例子(在线版本):



ASPX标签声明:

01.<ext:PageManager ID="PageManager1" runat="server" />
02.<ext:Timer ID="Timer1" Interval="3" Enabled="false" OnTick="Timer1_Tick" runat="server">
03.</ext:Timer>
04.<ext:Button ID="btnStartTimer" runat="server" Text="Start Timer" OnClick="btnStartTimer_Click">
05.</ext:Button>
06.<ext:Button ID="btnStopTimer" runat="server" Text="Stop Timer" OnClick="btnStopTimer_Click">
07.</ext:Button>
08.<br />
09.<ext:Label ID="labServerTime" runat="server" Text="This is current datetime.">
10.</ext:Label>



这里定义Timer1每隔3秒回发服务器一次(Interval="3"),默认不启用(Enabled="false"),同时定义后台事件处理函数(OnTick="Timer1_Tick")。


C#代码:

01.protected void Timer1_Tick(object sender, EventArgs e)
02.{
03.    labServerTime.Text = DateTime.Now.ToString();
04.}
05.protected void btnStartTimer_Click(object sender, EventArgs e)
06.{
07.    Timer1.Enabled = true;
08.}
09.protected void btnStopTimer_Click(object sender, EventArgs e)
10.{
11.    Timer1.Enabled = false;
12.}



在每隔3秒的事件处理函数Timer1_Tick中,只是简单的将页面中Label控件的文本改变为当前服务器时间。


ExtAspNet中Timer的实现

001.[ToolboxData("<{0}:Timer Interval=\"30\" runat=\"server\"></{0}:Timer>")]
002.[ToolboxBitmap(typeof(Timer), "res.toolbox_icons.Timer.bmp")]
003.[Description("定时器")]
004.[DefaultEvent("Tick")]
005.public class Timer : ControlBase, IPostBackEventHandler
006.{
007.    #region properties
008.    /// <summary>
009.    /// 是否可用
010.    /// </summary>
011.    [Category(CategoryName.OPTIONS)]
012.    [DefaultValue(true)]
013.    [Description("是否可用")]
014.    public virtual bool Enabled
015.    {
016.        get
017.        {
018.            object obj = ViewState["Enabled"];
019.            return obj == null ? true : (bool)obj;
020.        }
021.        set
022.        {
023.            ViewState["Enabled"] = value;
024.        }
025.    }
026.    /// <summary>
027.    /// 定时间隔(单位:秒)
028.    /// </summary>
029.    [Category(CategoryName.OPTIONS)]
030.    [DefaultValue(30)]
031.    [Description("定时间隔(单位:秒)")]
032.    public int Interval
033.    {
034.        get
035.        {
036.            object obj = ViewState["Interval"];
037.            return obj == null ? 30 : (int)obj;
038.        }
039.        set
040.        {
041.            ViewState["Interval"] = value;
042.        }
043.    }
044.    #endregion
045.    #region OnPreLoad
046.    protected override void OnPreLoad(object sender, EventArgs e)
047.    {
048.        base.OnPreLoad(sender, e);
049.        SaveAjaxProperty("Enabled", Enabled);
050.    }
051.    #endregion
052.    #region OnPreRender
053.    protected override void OnPreRender(EventArgs e)
054.    {
055.        base.OnPreRender(e);
056.        // 不渲染
057.        RenderWrapperDiv = false;
058.        string setupScript = String.Format("box.{0}=window.setInterval(function(){{{1}}}, {2});", ClientJavascriptID, GetPostBackEventReference(), Interval * 1000);
059.        if (Enabled)
060.        {
061.            AddPageFirstLoadAbsoluteScript(setupScript);
062.        }
063.        if (AjaxPropertyChanged("Enabled", Enabled))
064.        {
065.            string ajaxScript = String.Format("window.clearInterval(box.{0});", ClientJavascriptID);
066.            if (Enabled)
067.            {
068.                ajaxScript += setupScript;
069.            }
070.            AddAjaxPropertyChangedScript(ajaxScript);
071.        }
072.    }
073.    #endregion
074.    #region IPostBackEventHandler
075.    public void RaisePostBackEvent(string eventArgument)
076.    {
077.        OnTick(EventArgs.Empty);
078.    }
079.    #endregion
080.    #region OnTick
081.    private static readonly object _handlerKey = new object();
082.    /// <summary>
083.    /// 定时事件
084.    /// </summary>
085.    [Category(CategoryName.ACTION)]
086.    [Description("定时事件")]
087.    public event EventHandler Tick
088.    {
089.        add
090.        {
091.            Events.AddHandler(_handlerKey, value);
092.        }
093.        remove
094.        {
095.            Events.RemoveHandler(_handlerKey, value);
096.        }
097.    }
098.    protected virtual void OnTick(EventArgs e)
099.    {
100.        EventHandler handler = Events[_handlerKey] as EventHandler;
101.        if (handler != null)
102.        {
103.            handler(this, e);
104.        }
105.    }
106.    #endregion
107.}



从上往下看,首先是声明两个属性Enabled和Interval,中间OnPreRender是用来向页面中输出JavaScript代码,后面是OnTick事件的定义。

下面主要讲解OnPreRender中的代码:

1. 不考虑AJAX的支持的支持

如果不考虑ExtAspNet中所谓的原声的AJAX支持,我们可以简单的把OnPreRender重写为:

01.protected override void OnPreRender(EventArgs e)
02.{
03.    base.OnPreRender(e);
04.    // 不渲染
05.    RenderWrapperDiv = false;
06.    string setupScript = String.Format("box.{0}=window.setInterval(function(){{{1}}}, {2});", ClientJavascriptID, GetPostBackEventReference(), Interval * 1000);
07.    if (Enabled)
08.    {
09.        AddPageFirstLoadAbsoluteScript(setupScript);
10.    }
11.}


其中RenderWrapperDiv = false,用来说明此控件不需要向页面中输出任何HTML代码。
如果将上例中Enabled属性改为true,则会在页面中生成如下代码:

1.box.__0=window.setInterval(function(){__doPostBack('Timer1','');}, 3000);


如图:



2. 添加AJAX的支持

如果需要AJAX支持,那么我就需知道在此次的PostBack中,控件的那些属性发生了变化,ExtAspNet提供一套机制来完成这一任务,那就是你所看到的SaveAjaxProperty和AjaxPropertyChanged,我们有一篇文章专门说明这一问题。

我们来看下在上例中,点击“Start Timer”和“Stop Timer”分别发生了什么:
Start Timer:




Stop Timer:



对比Timer的源代码,是不是很清晰,其实ExtAspNet的控件编写并不是很复杂,如果你有好的想法不妨自己先尝试一下。



下载全部源代码


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP