BOS控件使用 - 进度条
金蝶云社区-_哇哈哈
_哇哈哈
15人赞赏了该文章 2,686次浏览 未经作者许可,禁止转载编辑于2018年06月13日 09:06:52

需求场景介绍

场景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));
        }
    }
}

赞 15