知识分享 - 处理时如何显示进度界面
金蝶云社区-JohnnyDing
JohnnyDing
6人赞赏了该文章 8,919次浏览 未经作者许可,禁止转载编辑于2015年09月11日 09:24:09

案例背景:
部分功能处理,处理起来,耗时较久,此时就需要显示一个滚动条,提醒用户正在进行中。
并且要锁住界面,避免用户在没有处理完毕时,进行其他操作。

案例说明:
添加一个"引入"菜单。
用户点击引入菜单时,弹出一个进度显示小窗口,显示引入进度。附带遮幕效果,防止用户在引入未完成时,进行其他处理。
引入处理完毕之后,关闭进度显示小窗口。

与使用进度条控件的差别:
本案例弹出一个系统预置的进度显示小界面,不需要在当前界面上添加进度条控件。
另外,还可以实现遮幕。

示例代码:
//**********************************************

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;
using Kingdee.BOS.KDThread;


namespace JDSample.FormPlugIn.DynamicForm
{
///


/// 演示如何显示进度条
///

///
/// 案例背景:
/// 部分功能处理,耗时较久,此时就需要显示一个滚动条,提醒用户正在进行中。
/// 并且要锁住界面,避免用户在没有处理完毕时,就进行其他操作
///

[Description("显示进度条")]
public class S150910ShowProcessFormEdit : AbstractDynamicFormPlugIn
{
///
/// 菜单点击事件
///

///
public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
{
if (e.BarItemKey.EqualsIgnoreCase("tb_JD_ImportEntry"))
{
this.ImportEntry();
}
}

///
/// 引入菜单处理函数:
/// 主要用于显示进度滚动界面,并调用引入实际处理子函数
///

private void ImportEntry()
{
// 显示一个进度显示界面:显示一个不停滚动的模拟进度


// bUseTruePro参数:是否显示真实的进度。
// bUseTruePro = false :
// 显示一个不停滚动的模拟进度,与实际处理进度没有关联。
// 此方案优点:实际处理代码无需计算进度
// 此方案缺点:进度不准确,且进度页面不会自动关闭。
// bUseTruePro = true: 进度界面显示真实进度
// 此方案优点:进度真实
// 此方案缺点:需要在处理代码中,不断的更新真实进度,更新语句
// this.View.Session["ProcessRateValue"] = 100;
// 特别说明,当进度更新到100时,进度界面会自动关闭
// 本案例选用此方案


var processForm = this.View.ShowProcessForm(
new Action(t => { }),
true,
"正在引入数据,请稍候...");


// 开启一个异步线程,处理引入功能
// using Kingdee.BOS.KDThread;
MainWorker.QuequeTask(() =>
{
try
{// 需要捕获错误,以确保处理结束时,关闭进度滚动界面

this.DoImportEntry();
}
finally
{
// 确保标记进度已经到达100%
this.View.Session["ProcessRateValue"] = 100;


// 引入完毕,关闭进度显示页面
var processView = this.View.GetView(processForm.PageId);
if (processView != null)
{
processView.Close();
this.View.SendDynamicFormAction(processView);
}
}
},
(t) => { });
}

///


/// 引入功能实际处理函数
///

private void DoImportEntry()
{
// 分成5次停留,模拟引入数据的时间消耗
// 每次停留2s,刷新一下实际进度值
System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = 20;

System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = 40;

System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = 60;

System.Threading.Thread.Sleep(2000);
// 更新进度
this.View.Session["ProcessRateValue"] = 80;
System.Threading.Thread.Sleep(2000);
// 更新进度:更新到100时,会自动关闭进度界面,结束进度
this.View.Session["ProcessRateValue"] = 100;
}
}
}