随笔-313  评论-12138  文章-1  trackbacks-256

使用ASP.NET Atlas编写显示真实进度的ProgressBar(进度条)控件

 英文版见:http://dflying.dflying.net/1/archive/100_building_a_real_time_progressbar_using_aspnet_atlas.html

当后台在进行某些长时间的操作时,如果能在页面上提供一个显示真实进度的进度条,而不是让用户不知情的等待或是从前的那些简单的估计,将是一个非常难得的出彩之处。现在使用ASP.NET Atlas完全有可能做到这些。这篇文章将讨论如何完成这一功能并介绍一些有关Atlas客户端控件开发的基本概念。您同时可以在这里下载示例程序以及源文件

实现网页上的进度条想法其实很简单:编写一个客户端的Atlas控件,每隔一段时间请求一次服务器,并使用返回的当前进度数据更新进度条的显示。在这个示例中,将有四个部分的代码组成:

  1. 一个需要较长时间才能完成的Web Service
  2. 一个用来查询上述Web Service进度的Web Service
  3. 客户端Atlas进度条(ProgressBar)控件,负责维护客户端逻辑并输出可视化UI。这也是本示例中最重要的一个组件,在将来可被重用于其他页面或程序的开发
  4. 包含上述Web Service以及控件的ASP.NET测试页面

下面我们一步一步地来实现以上四个步骤:

 需要较长时间完成的Web Service

在实际的程序中,一个需要较长时间完成的Web Service可能有如下声明:

1[WebMethod]
2public void TimeConsumingTask()
3{
4    ConnectToDataBase();
5    GetSomeValueFromDataBase();
6    CopySomeFilesFromDisk();
7    GetARemoteFile();
8}

这样我们就可以插入一些辅助方法来确定当前进度完成情况,setProgress(int)用来设定当前的进度完成百分比:

 1[WebMethod]
 2public void TimeConsumingTask()
 3{
 4    setProgress(0);
 5    ConnectToDataBase();
 6    setProgress(10);
 7    GetSomeValueFromDataBase();
 8    setProgress(40);
 9    CopySomeFilesFromDisk();
10    setProgress(50);
11    GetARemoteFile();
12    setProgress(100);
13}

在本示例中,我们仅仅使用Cache来储存进度完成信息并利用Thread.Sleep()方法模拟操作的延迟:

 1[WebMethod]
 2public int StartTimeConsumingTask()
 3{
 4    string processKey = this.Context.Request.UserHostAddress;
 5    string threadLockKey = "thread" + this.Context.Request.UserHostAddress;
 6    object threadLock = this.Context.Cache[threadLockKey];
 7    if (threadLock == null)
 8    {
 9        threadLock = new object();
10        this.Context.Cache[threadLockKey] = threadLock;
11    }

12
13    // Only allow 1 running task per user.
14    if (!Monitor.TryEnter(threadLock, 0))
15        return -1;
16
17    DateTime startTime = DateTime.Now;
18
19    // Simulate a time-consuming task.
20    for (int i = 1; i <= 100; i++)
21    {
22        // Update the progress for this task.
23        this.Context.Cache[processKey] = i;
24        Thread.Sleep(70);
25    }

26
27    Monitor.Exit(threadLock);
28
29    return (DateTime.Now - startTime).Seconds;
30}

31

 

查询进度的Web Service

很容易实现,只需从Cache中取得进度信息:

 1[WebMethod]
 2public int GetProgress()
 3{
 4    string processKey = this.Context.Request.UserHostAddress;
 5    object progress = this.Context.Cache[processKey];
 6    if (progress != null)
 7    {
 8        return (int)progress;
 9    }

10
11    return 0;
12}

 

客户端进度条(ProgressBar)控件

第一步:从Sys.UI.Control继承

ProgressBar控件应该继承自Atlas的控件基类Sys.UI.Control,并且声明为密封类(sealed class,不能再被继承)。Sys.UI.Control基类包含了一些所有的控件共有的操作与方法。比如,将自己与某个HTML元素关联起来(也就是所谓的binding)等。同时也要注册以让Atlas了解这个新的类型以便今后的声明及使用,例如,让Atlas可以取得这个类型的描述等。

1Sys.UI.ProgressBar = function(associatedElement) {
2    Sys.UI.ProgressBar.initializeBase(this, [associatedElement]);
3
4}

5Type.registerSealedClass('Sys.UI.ProgressBar', Sys.UI.Control);
6Sys.TypeDescriptor.addType('script','progressBar', Sys.UI.ProgressBar);
7

 

第二步:添加私有成员并书写相应的Setter/Getter

下面需要添加一些属性用来设定我们的控件。在这个例子中,我们需要三个属性:

  1. Interval. 每次重新查询进度并更新进度条的间隔时间。单位:毫秒
  2. Service Url. Web Service文件的路径。
  3. Service Method. 取得进度信息的方法名。

这些属性应该严格遵守Atlas的命名规范:Getter应该以'get_'开头,Setter应该以'set_'开头并传入一个参数。还需要在控件的描述方法(descriptor)中添加对于这些属性的说明。有关描述方法(descriptor)将在第四步中说明。例如,针对Service Method属性,我们有如下声明:

1var _serviceMethod;
2
3this.get_serviceMethod = function() {
4    return _serviceMethod;
5}

6
7this.set_serviceMethod = function(value) {
8    _serviceMethod = value;
9}

 

第三步:使用Timer控件每隔一段时间查询一次Web Service

Sys.Timer用于每过一段时间调用一个方法(发出一个事件),我们可以定义一个委托来指向这个方法,并在并在每一个时间段内查询这个Web Service。为了避免浏览器内存泄露,在控件析构(dispose)的时候应该记得做一些必要的清理。

还有,注意当前一个请求并没有返回时,不应该发送第二个请求。

 1var _timer = new Sys.Timer();
 2var _responsePending;
 3var _tickHandler;
 4var _obj = this;
 5
 6this.initialize = function() {
 7    Sys.UI.ProgressBar.callBaseMethod(this, 'initialize');
 8    _tickHandler = Function.createDelegate(thisthis._onTimerTick);
 9    _timer.tick.add(_tickHandler);
10    this.set_progress(0);
11}

12
13this.dispose = function() {
14    if (_timer) {
15        _timer.tick.remove(_tickHandler);
16        _tickHandler = null;
17        _timer.dispose();
18    }

19    _timer = null;
20    associatedElement = null;
21    _obj = null;
22
23    Sys.UI.ProgressBar.callBaseMethod(this, 'dispose');
24}

25
26this._onTimerTick = function(sender, eventArgs) {
27    if (!_responsePending) {
28        _responsePending = true;
29        
30        // Asynchronously call the service method.
31        Sys.Net.ServiceMethod.invoke(_serviceURL, _serviceMethod, nullnull, _onMethodComplete);
32    }

33}

34
35function _onMethodComplete(result) {
36    // Update the progress bar.
37    _obj.set_progress(result);
38    _responsePending = false;
39}

 

第四步:添加控制方法

我们应该可以控制进度条的开始/停止。并且,对于一个Atlas控件,相关的描述方法(descriptor)也是必须的。Atlas会利用它来描述这个类型的信息。

 1this.getDescriptor = function() {
 2    var td = Sys.UI.ProgressBar.callBaseMethod(this, 'getDescriptor');
 3    td.addProperty('interval', Number);
 4    td.addProperty('progress', Number);
 5    td.addProperty('serviceURL', String);
 6    td.addProperty('serviceMethod', String);
 7    td.addMethod('start');
 8    td.addMethod('stop');
 9    return td;
10}

11
12this.start = function() {
13    _timer.set_enabled(true);
14}

15
16this.stop = function() {
17    _timer.set_enabled(false);
18}

 

OK,目前为止客户端的控件就完成了。我们把它存为ProgressBar.js

ASP.NET Testing Page ASP.NET测试页面

对于任何的Atlas页面,我们第一件需要做的事情就是添加一个ScriptManager服务器控件。在这个示例中我们将引用ProgressBar控件,较长时间才能完成的Web Service以及进度查询Web Service。(这两个Web Service位于同一个文件中:TaskService.asmx

1<atlas:ScriptManager ID="ScriptManager1" runat="server" >
2    <Scripts>
3        <atlas:ScriptReference Path="ScriptLibrary/ProgressBar.js" ScriptName="Custom" />
4    </Scripts>
5    <Services>
6        <atlas:ServiceReference Path="TaskService.asmx" />
7    </Services>
8</atlas:ScriptManager>

接下来是页面的布局与样式:

 1<style type="text/css">
 2{
 3    font-family: tahoma;
 4}

 5.progressBarContainer {
 6    border: 1px solid #000;
 7    width: 500px;
 8    height: 15px;
 9}

10.progressBar {
11    background-color: green;
12    height: 15px;
13    width: 0px;
14    font-weight: bold;
15}

16
</style>
17
18<div>Task Progress</div>
19<div class="progressBarContainer">
20    <div id="pb" class="progressBar"></div>
21</div>
22<input type="button" id="start" onclick="startTask();return false;" value="Start the Time Consuming Task!" />
23<div id="output" ></div>

最后是一段JavaScript启动那个较长时间才能完成的Web Service并让ProgressBar控件开始工作:


截图和下载

现在所有的事情都搞定了,可以运行了!

页面初始化:

运行中:

运行完成:

 

示例程序以及源文件可以在这里下载

posted on 2006-03-28 18:09 Dflying Chen 阅读(12779) 评论(76) 编辑 收藏

评论:
#1楼 2006-03-28 18:27 | 高海东      
hao
 回复 引用 查看   
#2楼 2006-03-28 19:38 | 深夜醉猫      
好,正需要这个呢
 回复 引用 查看   
#3楼 2006-03-28 19:39 | U2U      
hao!
 回复 引用 查看   
#4楼 2006-03-28 19:54 | cnlamar      
不错,但实现起来真够烦琐的。
 回复 引用 查看   
#5楼[楼主] 2006-03-28 20:05 | Dflying Chen      
@cnlamar
您可以直接用我写好的Control,没有必要重新造轮子。我想这也是Atlas的一大优势吧,把OO引入JavaScript。

 回复 引用 查看   
#6楼[楼主] 2006-03-28 20:07 | Dflying Chen      
@深夜醉猫
使用这个控件需要注意以下几点:
1 每次查询的时间间隔不宜太短,避免给服务器造成太大压力。
2 不适合上载文件等无法取得实际进度的操作。

 回复 引用 查看   
#7楼 2006-03-28 22:51 | 浪人|努力      
不错,不是和登陆163邮箱的进度条一样?
呵呵,支持。。。

 回复 引用 查看   
#8楼 2006-03-29 00:56 | 绿叶      
滚动条用在比较长时间得操作上面,而实际上很多地方是用不上这种的。
一个非常关键的原因就是很难估计总时间和
二是这样做增加了服务器的负担
一般是比较单一,时间长的时候才用上,比如upload大文件
实现滚动条是很简单的,难的是怎么算时间总和这个逻辑上面,用普通的ajax即可达到这种效果。

 回复 引用 查看   
#9楼 2006-03-29 00:57 | Charly      
不错,先收藏起来再看。
 回复 引用 查看   
#10楼[楼主] 2006-03-29 08:49 | Dflying Chen      
@绿叶
我想您没有仔细看我的文章,这里的实现不是要估计*时间*,而是得到工作实际完成的百分比。这并不是一个估计,而是实际的时间。
upload大文件在我前面评论的补充中是不应该使用这个控件的。
其实实际生活中有很多需要长时间才能完成的任务,特别是当服务器是作为一个应用服务器而不仅仅是一个Web服务器时。

 回复 引用 查看   
#11楼[楼主] 2006-03-29 08:50 | Dflying Chen      
@浪人|努力
没有见过163的进度条,但估计不会是显示真实进度的。

 回复 引用 查看   
#12楼 2006-03-29 09:00 | Terrylee      
嗯,非常不错!

可惜现在没时间研究,先收藏再说:)

 回复 引用 查看   
#13楼[楼主] 2006-03-29 09:32 | Dflying Chen      
@Terrylee
如果您只是需要使用的话,不需要研究太多细节与实现的。

 回复 引用 查看   
#14楼 2006-03-29 10:22 | 绿叶      
@chen
你可以看看我的这个:
http://aspspider.net/wjshome/Uploader/Index.ashx
刚刚和你给 @深夜醉猫 回复的两点相反。

 回复 引用 查看   
#15楼[楼主] 2006-03-29 11:10 | Dflying Chen      
@绿叶
不好意思再公司访问您的网站速度非常慢,有没有相应的代码可以分享呢?
据我的估计您的进度显示实现是由估算生成的.然而我的例子是用来显示真实的进度信息.有什么办法可以取得上传文件的百分比呢?

 回复 引用 查看   
#16楼 2006-03-29 14:53 | 阿不      
好东西,不过对于普通的访问查询.比如查询数据库数据,我该如何计算当前进度呢?还有就是有了真实的进度条后,有可能会给服务器带来不必要的性能影响.
 回复 引用 查看   
#17楼 2006-03-29 15:32 | 阿 不
没用
 回复 引用   
#18楼[楼主] 2006-03-29 20:34 | Dflying Chen      
@阿不
这个控件有一定的局限性,只适合可以分割的非原子操作。
性能影响以及用户满意永远是不可调和的,孰是孰非应该由开发者选择。
本文另外的目的是抛砖引玉,介绍Atlas下客户端控件的开发。

 回复 引用 查看   
#19楼 2006-03-29 22:52 | 阿不      
@阿 不
 这是哪位冒充我的号啊?怎么连网址都使用我的啊!可惜我的名字中间没有一个空格!请自重!

 回复 引用 查看   
#20楼 2006-03-29 22:54 | 阿不      
让那位假“阿不”不要在这边挑拨离间,DUDU不知道有没有好办法解决这个问题啊!
 回复 引用 查看   
#21楼[楼主] 2006-03-29 22:56 | Dflying Chen      
@阿不
这种办法没有办法避免的吧,只要以非注册用户发表都可以。
呵呵,不必太在意了。

 回复 引用 查看   
#22楼 2006-03-30 12:00 | 深夜醉猫      
@Dflying Chen
那上载文件,显示具体的进度,采用什么方法呢!


 回复 引用 查看   
#23楼[楼主] 2006-03-30 13:11 | Dflying Chen      
@深夜醉猫
我没有办法了

 回复 引用 查看   
#24楼 2006-04-04 09:52 | kiler      
好东西,收藏研究
 回复 引用 查看   
#25楼 2006-04-13 10:46 | 随风飘散      
it's very nice
you are hero

 回复 引用 查看   
#26楼[楼主] 2006-04-13 10:49 | Dflying Chen      
@随风飘散
just enjoy :)

 回复 引用 查看   
#27楼 2006-04-15 23:37 | 不好[未注册用户]
不能真正意义上的反应进度情况
 回复 引用   
#28楼 2006-04-19 18:19 | THIN      
不错,
开始吓我一跳,还以为是.net2.0或别的什么东东提供反馈数据下载进度的功能了,原来也是模拟

 回复 引用 查看   
#29楼[楼主] 2006-04-19 18:23 | Dflying Chen      
@THIN
不是模拟吧,这个还是蛮真实的,只有一点网络延迟而已

 回复 引用 查看   
#30楼 2006-04-19 20:18 | THIN      
我的意思是,用另一个Webservice来专门跟踪一个进程的进展,有点曲线救国的味道,我开始以为是Asp.net提供什么新的API能计算一个请求的处理进度
 回复 引用 查看   
#31楼[楼主] 2006-04-19 20:32 | Dflying Chen      
@THIN
确实如此,但是HTTP是无状态的,这从根本上就没办法实现服务器端push到客户端,只能客户端不停的查询。

 回复 引用 查看   
#32楼 2006-05-12 17:34 | seman_cui[未注册用户]
最好可以设置一下有视频的演示
 回复 引用   
#33楼[楼主] 2006-05-12 18:50 | Dflying Chen      
@seman_cui
我不知道什么软件可以录下来啊,最好录成Flash格式。

 回复 引用 查看   
#34楼 2006-05-14 11:01 | 随心所欲      
方法有点原始。
我看实用性不大,这样的请求回给服务器造成很多不必要的开销。

 回复 引用 查看   
#35楼[楼主] 2006-05-14 12:16 | Dflying Chen      
@随心所欲
有些时候还是有必要的,比如提交给服务器一个复杂的科学计算。

 回复 引用 查看   
#36楼[楼主] 2006-05-14 12:16 | Dflying Chen      
@随心所欲
有现代的方法么?

 回复 引用 查看   
#37楼 2006-06-07 08:40 | chendify[未注册用户]
http://my.opera.com/12530mp3/homes/blog/mp3铃声.htm">http://my.opera.com/12530mp3/homes/blog/mp3铃声.htm mp3铃声
http://my.opera.com/12530mp3/homes/blog/mp3手机铃声.htm mp3手机铃声
http://my.opera.com/12530mp3/homes/blog/mp3手机铃声下载.htm mp3手机铃声下载
http://my.opera.com/12530mp3/homes/blog/mp3格式铃声.htm mp3格式铃声
http://my.opera.com/12530mp3/homes/blog/mp3超强铃声转换器.htm mp3超强铃声转换器
http://my.opera.com/12530mp3/homes/blog/mp3铃声.htm">http://my.opera.com/12530mp3/homes/blog/mp3铃声.htm mp3铃声
http://my.opera.com/12530mp3/homes/blog/mp3铃声下载.htm mp3铃声下载
http://my.opera.com/12530mp3/homes/blog/mp3铃声制作.htm mp3铃声制作
http://my.opera.com/12530mp3/homes/blog/mp3铃声制作工具.htm mp3铃声制作工具
http://my.opera.com/12530mp3/homes/blog/mp3铃声制作软件.htm mp3铃声制作软件
http://my.opera.com/12530mp3/homes/blog/mp3铃声大全.htm mp3铃声大全
http://my.opera.com/12530mp3/homes/blog/三星mp3铃声.htm 三星mp3铃声
http://my.opera.com/12530mp3/homes/blog/搞笑mp3铃声.htm 搞笑mp3铃声
http://my.opera.com/12530mp3/homes/blog/最新mp3铃声.htm 最新mp3铃声
http://my.opera.com/12530mp3/homes/blog/联通mp3铃声下载.htm 联通mp3铃声下载
http://my.opera.com/12530mp3/homes/blog/诺基亚mp3铃声下载.htm 诺基亚mp3铃声下载
http://my.opera.com/12530mp3/homes/blog/摩托罗拉mp3铃声.htm 摩托罗拉mp3铃声
http://my.opera.com/12530mp3/homes/blog/真人真唱mp3铃声.htm 真人真唱mp3铃声
http://my.opera.com/12530mp3/homes/blog/小灵通mp3铃声.htm 小灵通mp3铃声
http://my.opera.com/12530mp3/homes/blog/我要mp3铃声.htm 我要mp3铃声
http://my.opera.com/12530mp3/homes/blog/免费下载mp3铃声.htm 免费下载mp3铃声
http://my.opera.com/12530mp3/homes/blog/免费mp3手机铃声.htm 免费mp3手机铃声
http://my.opera.com/12530mp3/homes/blog/nokia免费mp3铃声.htm nokia免费mp3铃声
http://my.opera.com/12530mp3/homes/blog/mp3特效铃声.htm mp3特效铃声
http://my.opera.com/12530mp3/homes/blog/mp3铃声网.htm mp3铃声网

 回复 引用   
#39楼 2006-06-21 12:53 | samsumg[未注册用户]
http://my.opera.com/mp3_phone/homes/samsung/三星x458铃声下载.htm 三星x458铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星x478铃声下载.htm 三星x478铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星x628铃声下载.htm 三星x628铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星x668铃声下载.htm 三星x668铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星x708铃声下载.htm 三星x708铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星铃声免费下载.htm 三星铃声免费下载
http://my.opera.com/mp3_phone/homes/samsung/三星铃声下载.htm 三星铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星免费铃声下载.htm 三星免费铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星手机铃声大全.htm 三星手机铃声大全
http://my.opera.com/mp3_phone/homes/samsung/三星手机铃声下载.htm 三星手机铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星手机铃声制作.htm 三星手机铃声制作
http://my.opera.com/mp3_phone/homes/samsung/三星手机免费铃声.htm 三星手机免费铃声
http://my.opera.com/mp3_phone/homes/samsung/三星40和弦铃声下载.htm 三星40和弦铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星e770彩信下载.htm 三星e770彩信下载
http://my.opera.com/mp3_phone/homes/samsung/三星e778彩信下载.htm 三星e778彩信下载
http://my.opera.com/mp3_phone/homes/samsung/三星midi铃声下载.htm 三星midi铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星mmf格式铃声.htm 三星mmf格式铃声
http://my.opera.com/mp3_phone/homes/samsung/三星mmf铃声下载.htm 三星mmf铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星cdma手机图片.htm 三星cdma手机图片
http://my.opera.com/mp3_phone/homes/samsung/三星mp3铃声下载.htm 三星mp3铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星彩信图片下载.htm 三星彩信图片下载
http://my.opera.com/mp3_phone/homes/samsung/三星彩信下载.htm 三星彩信下载
http://my.opera.com/mp3_phone/homes/samsung/三星待机图片.htm 三星待机图片
http://my.opera.com/mp3_phone/homes/samsung/三星单音铃声下载.htm 三星单音铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星短信铃声下载.htm 三星短信铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星和弦铃声下载.htm 三星和弦铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星经典铃声下载.htm 三星经典铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星玲声下载.htm 三星玲声下载
http://my.opera.com/mp3_phone/homes/samsung/三星内置铃声下载.htm 三星内置铃声下载
http://my.opera.com/mp3_phone/homes/samsung/三星普通铃声下载.htm 三星普通铃声下载

 回复 引用   
#40楼 2006-08-06 04:47 | CnEve[未注册用户]
好文献
 回复 引用   
#41楼[楼主] 2006-08-06 08:44 | Dflying Chen      
@CnEve
谢谢

 回复 引用 查看   
#42楼[楼主] 2006-08-06 08:45 | Dflying Chen      
这么多广告阿
 回复 引用 查看   
#43楼 2006-09-07 08:27 | jed[未注册用户]
学习了
 回复 引用   
#44楼 2006-09-07 08:27 | jed[未注册用户]
收藏了
http://www.mh-chine.com

 回复 引用   
#45楼[楼主] 2006-09-08 00:24 | Dflying Chen      
@jed
广告?

 回复 引用 查看   
#46楼 2006-09-12 11:11 | 物流防窜货软件标签[未注册用户]


谢谢

 回复 引用   
#47楼 2006-09-13 17:51 | 111[匿名][未注册用户]
我也想写blog,请问大侠你的网站上可以折叠的代码是用什么工具实现的?
 回复 引用   
#48楼[楼主] 2006-09-14 20:33 | Dflying Chen      
@111[匿名]
在书写Blog的时候,点击“插入代码”就好了

 回复 引用 查看   
#49楼 2006-10-19 16:36 | ke[未注册用户]
这里Sys.UI.Control也即是atlas标准js文件里的的命名空间为什么可以访问, 下面的代码中没有引入atlas的js文件呀!请教了,为什么可以引用Sys.UI.Control
<Scripts>
<atlas:ScriptReference Path="ScriptLibrary/ProgressBar.js" ScriptName="Custom" />
</Scripts>

 回复 引用   
#50楼[楼主] 2006-10-19 19:01 | Dflying Chen      
@ke
ScriptManager会默认引用Atlas.js文件的
Sys.UI.Control就定义在其中。

 回复 引用 查看   
#51楼 2006-12-05 13:31 | xtive[未注册用户]
确实不错,以前总是没法实现
 回复 引用   
#52楼[楼主] 2006-12-05 17:32 | Dflying Chen      
@xtive
呵呵,很老的东西了……现在代码已经过时了

 回复 引用 查看   
#53楼 2007-01-10 11:00 | 小叶劲飞[未注册用户]
不好用啊,我一点那按钮,就提示“Sys”未订义,这是怎么回事?
 回复 引用   
#54楼 2007-01-17 23:13 | HI[未注册用户]
从某种程度来说,这不是真正意义上的进度条,是不是我要Thread.Sleep(10) 进行一番估计呢
 回复 引用   
#55楼[楼主] 2007-01-29 11:38 | Dflying Chen      
@小叶劲飞
现在的最新版本中已经不能用了

 回复 引用 查看   
#56楼[楼主] 2007-01-29 11:38 | Dflying Chen      
@HI
从哪种程度上不是呢?

 回复 引用 查看   
#57楼 2007-02-07 11:48 | 周海军      
好的很
我正想实现这样的功能.不知道该怎么入手.
谢谢!

 回复 引用 查看   
#58楼[楼主] 2007-02-07 22:16 | Dflying Chen      
@周海军
:)

 回复 引用 查看   
#59楼 2007-03-13 12:36 | jmso[未注册用户]
那要怎样才能让它用在AJAX 1.0后, 还会动的?(要怎么改写才好?看了很久改版文, 还是不会改)
 回复 引用   
#60楼[楼主] 2007-03-13 18:52 | Dflying Chen      
@jmso
恩,要改很多东西的……等有时间了我写一下哦:)

 回复 引用 查看   
#61楼 2007-03-15 17:39 | jimlong[未注册用户]
我是刚刚接触AJAX,能否多加一点注释,我看到云来雾去的。
我想在你的基础上修改,总共有7秒,我想在第4秒的时候,把BUTTON的ENABLE变成false,怎么做?
难点一、不知道怎么取这个时间的值,
难点二、如果用脚本把button的enable变成false.

 回复 引用   
#62楼[楼主] 2007-03-15 21:46 | Dflying Chen      
@jimlong
恩,您可以使用Timer组件,就是个客户端的定时器,看一下Atlas的官方文档吧,使用起来很方便的:)

 回复 引用 查看   
#63楼 2007-03-16 21:20 | jimlong[未注册用户]
我的思路是这样,取回进度条的时间,进行判断,如果大于4,那我把把BUTTON的ENABLE值变为FALSE
你所编写的是不是纯javascript语言?你能在你的基础上把我的思路做出来吗?谢谢,这样我就容易看得明白一点。

 回复 引用   
#64楼 2007-03-20 23:23 | Aries[未注册用户]
代码相当好,但是我在应用的时候遇到了一个问题。

为什么在本地调试的时候可以 正常运行,而其他机器访问却不可以了呢?

 回复 引用   
#65楼[楼主] 2007-03-21 00:10 | Dflying Chen      
@Aries
有什么错误么?

 回复 引用 查看   
#66楼[楼主] 2007-03-21 00:11 | Dflying Chen      
@jimlong
时间可以在客户端直接判断,不用服务器的参与。这就是纯粹的JavaScript

 回复 引用 查看   
#67楼 2007-03-26 10:19 | jimlong[未注册用户]
我想一打开页面,不点击按键就直接显示进度条
我在body中加了onload
<body onload="startTask()">

页面出错
行:30
字符:9
错误:缺少对像
代码:0
URL:.......

行30的内容是
var pb = new Sys.UI.ProgressBar($('pb'));

 回复 引用   
#68楼 2007-03-27 09:55 | 农夫三拳      
暂4
 回复 引用 查看   
#69楼 2008-04-02 17:25 | sdtysdu      
我在学习《使用ASP.NET Atlas编写显示真实进度的ProgressBar(进度条)控件》(原文是:http://dflying.cnblogs.com/archive/2006/03/28/361146.html),觉得很不错,解决了.NET进度条的问题,但是当我用ASP。NET AJAX1.0来做,复制了示例代码,发现一个问题,就是
它的示例代码是用于ASP.NET Atlas,如果我用的是ASP。NET AJAX1.0,它的脚本文件写法就不一样,是新的.NET框架的JAVASCRIT脚本扩展语法,恳请高手帮我修改一下:
源代码如下:
Sys.UI.ProgressBar = function(associatedElement) {
Sys.UI.ProgressBar.initializeBase(this, [associatedElement]);

var _timer = new Sys.Timer();
var _progress = 0;
var _serviceURL;
var _serviceMethod;
var _responsePending;
var _tickHandler;
var _obj = this;

this.get_progress = function() {
return _progress;
}

this.set_progress = function(value) {
if (value > = 100) {
_timer.set_enabled(false);
}
_progress = value;
associatedElement.style.width = value + "%";
associatedElement.innerHTML = value == 100 ?
"Done!" : value + "%";
}

this.get_interval = function() {
return _timer.get_interval();
}

this.set_interval = function(value) {
_timer.set_interval(value);
}

this.get_serviceURL = function() {
return _serviceURL;
}

this.set_serviceURL = function(value) {
_serviceURL = value;
}

this.get_serviceMethod = function() {
return _serviceMethod;
}

this.set_serviceMethod = function(value) {
_serviceMethod = value;
}

this.getDescriptor = function() {
var td = Sys.UI.ProgressBar.callBaseMethod(this,
'getDescriptor');
td.addProperty('interval', Number);
td.addProperty('progress', Number);
td.addProperty('serviceURL', String);
td.addProperty('serviceMethod', String);
td.addMethod('start');
td.addMethod('stop');
return des;
}

this.initialize = function() {
Sys.UI.ProgressBar.callBaseMethod(this, 'initialize');
_tickHandler = Function.createDelegate(this,
this._onTimerTick);
_timer.tick.add(_tickHandler);
this.set_progress(0);
}

this.dispose = function() {
if (_timer) {
_timer.tick.remove(_tickHandler);
_tickHandler = null;
_timer.dispose();
}
_timer = null;
associatedElement = null;
_obj = null;

Sys.UI.ProgressBar.callBaseMethod(this, 'dispose');
}

this.start = function() {
_timer.set_enabled(true);
}

this.stop = function() {
_timer.set_enabled(false);
}

this._onTimerTick = function(sender, eventArgs) {
if (!_responsePending) {
_responsePending = true;

// Asynchronously call the service method.
Sys.Net.ServiceMethod.invoke(_serviceURL,
_serviceMethod, null, null, _onMethodComplete);
}
}

function _onMethodComplete(result) {
// Update the progress bar.
_obj.set_progress(result);
_responsePending = false;
}
}
Type.registerSealedClass('Sys.UI.ProgressBar', Sys.UI.Control);
Sys.TypeDescriptor.addType('script','progressBar', Sys.UI.ProgressBar);



 回复 引用 查看   
#70楼 2009-12-19 11:10 | 菜 鸟[未注册用户]
大哥们,这个我下载实例运行。怎么一点按钮报'TaskService'未定义错误.我是新手。指点下
 回复 引用   
#71楼 2010-04-28 15:15 | nature_126      
不是很懂
 回复 引用 查看   
#72楼 2011-01-11 17:13 | 学知者      
这个我下载实例运行。怎么一点按钮报'TaskService'未定义错误.我是新手。指点下

 回复 引用 查看   
#73楼 2011-01-11 17:14 | 学知者      
这个我下载实例运行。怎么一点按钮报'TaskService'未定义错误.我是新手。指点下

 回复 引用 查看   
#74楼 2011-01-11 17:18 | 学知者      
楼主:解决下
怎么一点按钮报'TaskService'未定义错误.

 回复 引用 查看   
除非特别声明,本站内所有资源,包括但不限于文章,代码,图片等,均应用于Dflying版权说明
关于ASP.NET AJAX,您可以:
直接阅读ASP.NET AJAX文章分类
Atlas文章打包下载(截至4/28/2006)
加入ASP.NET AJAX学习团队
询问关于ASP.NET AJAX的问题
加入ASP.NET AJAX讨论群
阅读愚作《ASP.NET AJAX程序设计》
点击阅读
点击阅读


关于Windows Vista,您可以:
加入Windows Vista开发团队!
昵称:Dflying Chen
园龄:5年10个月
粉丝:127
关注:0

搜索

 
 

最新随笔

随笔分类(352)

随笔档案(313)

Blog Roll

Dflying的其他Blog

Online Chat

统计信息

积分与排名

  • 积分 - 2442908
  • 排名 - 7

最新评论

阅读排行榜

评论排行榜