没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|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
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号