需求场景介绍
场景1:
需要在服务器上进行一项复杂的业务处理,耗时比较久,希望能够实时的显示出处理进度,避免用户毫无所知的等待;
场景2:
由用户启动,定时在服务器自动执行某些逻辑,把结果反馈给用户。
进度条控件启动后,会定时到服务端,获取最新进度,非常适合上面两种场景。
案例说明
界面上,包括一个进度条,一个启动按钮,一个停止按钮
点击启动按钮后,开始进度;点击停止按钮,结束进度
每隔2秒,进度条会到服务端获取最新进度,并显示一个提示信息
图一:设计界面
图二:运行效果
演示代码
//********************************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
namespace JDSample.FormPlugIn.DynamicForm
{
/// <summary>
/// 演示使用进度条控件,定时到服务端获取进度
/// </summary>
/// <remarks>
/// 本案例,界面上需要放一个进度条、一个启动按钮、一个停止按钮
/// </remarks>
[Description("演示使用进度条控件,定时到服务端获取进度")]
public class S161223ProgressBarEdit : AbstractDynamicFormPlugIn
{
/// <summary>
/// 进度条
/// </summary>
private ProgressBar _progressBar = null;
/// <summary>
/// 当前进度
/// </summary>
private int _progressValue = 0;
/// <summary>
/// 界面初始化
/// </summary>
/// <param name="e"></param>
public override void OnInitialize(InitializeEventArgs e)
{
this._progressBar = this.View.GetControl<ProgressBar>("F_JD_ProgressBar");
}
/// <summary>
/// 按钮点击事件:启动进度条
/// </summary>
/// <param name="e"></param>
public override void ButtonClick(ButtonClickEventArgs e)
{
if (e.Key.EqualsIgnoreCase("F_JD_Start"))
{
if (this._progressBar != null)
{
// 初始化当前进度:
this._progressValue = 0;
// 启动进度条,每个2s,到服务器获取一次进度。
// 如果进度达到了100,则自动停止
this._progressBar.Start(2);
// 开启一个新线程,处理需要长时间进行的业务
Kingdee.BOS.KDThread.MainWorker.QuequeTask(
() =>
{
// TODO: 异步处理
},
(asynResult) =>
{
if (asynResult != null && asynResult.Exception != null)
{
this.View.ShowMessage(asynResult.Exception.Message);
}
//TODO : 异步处理完毕,进行收尾
});
}
}
else if (e.Key.EqualsIgnoreCase("F_JD_Stop"))
{
// 通过设置当前进度为100,通知进度条,任务已经完成
this._progressValue = 100;
}
}
/// <summary>
/// 进度条,咨询进度
/// </summary>
/// <param name="e"></param>
public override void OnQueryProgressValue(QueryProgressValueEventArgs e)
{
if (this._progressValue < 100)
{
// 更新进度:进度+1,演示进度的变化
// 只有演示代码才需要在此更新进度,
// 实际业务,会在处理业务的异步进程中,刷新进度变量的值
this._progressValue++;
if (this._progressValue == 100)
{
// 进度到了100,重头再来
this._progressValue = 1;
}
}
// 返回进度给前端
e.Value = this._progressValue;
this.View.ShowMessage(string.Format("第{0}次咨询进度", this._progressValue));
}
}
}
推荐阅读