【知识分享】 界面处理时如何显示进度界面
金蝶云社区-_哇哈哈
_哇哈哈
14人赞赏了该文章 978次浏览 未经作者许可,禁止转载编辑于2018年07月13日 09:17:52

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


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

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


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

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
{
    /// <summary>
    /// 演示如何显示进度条
    /// </summary>
    /// <remarks>
    /// 案例背景:
    /// 部分功能处理,耗时较久,此时就需要显示一个滚动条,提醒用户正在进行中。
    /// 并且要锁住界面,避免用户在没有处理完毕时,就进行其他操作

    /// </remarks>
    [Description("显示进度条")]
    public class S150910ShowProcessFormEdit : AbstractDynamicFormPlugIn
    {
        /// <summary>
        /// 菜单点击事件
        /// </summary>
        /// <param name="e"></param>
        public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
        {
            if (e.BarItemKey.EqualsIgnoreCase("tb_JD_ImportEntry"))
            {
                this.ImportEntry();
            }
        }

        /// <summary>
        /// 引入菜单处理函数:
        /// 主要用于显示进度滚动界面,并调用引入实际处理子函数
        /// </summary>
        private void ImportEntry()
        {
            // 显示一个进度显示界面:显示一个不停滚动的模拟进度

            // bUseTruePro参数:是否显示真实的进度
            // bUseTruePro = false :
            // 显示一个不停滚动的模拟进度,与实际处理进度没有关联。
            // 此方案优点:实际处理代码无需计算进度
            // 此方案缺点:进度不准确,且进度页面不会自动关闭


            // bUseTruePro = true: 进度界面显示真实进度
            // 此方案优点:进度真实
            // 此方案缺点:需要在处理代码中,不断的更新真实进度,更新语句
            // this.View.Session["ProcessRateValue"] = 100;
            // 特别说明,当进度更新到100时,进度界面会自动关闭
            // 本案例选用此方案

            var processForm = this.View.ShowProcessForm(
                new Action<FormResult>(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) => { });
        }

        /// <summary>
        /// 引入功能实际处理函数
        /// </summary>
        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;
        }
    }
}


转载自金蝶社区---JohnnyDing大神

赞 14