Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果
时间:2019-11-18
本文章向大家介绍Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果,主要包括Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
场景
在Winform中实现弹窗式进度条
就是新建一个窗体,然后在窗体中加入进度条控件,然后在触发进度条的事件中将加载进度报告给
进度条控件。
注:
博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
设计进度条窗体
新建窗体FrmProgressBar,打开设计页面,打开DevExpress的工具箱。
拖拽一个SplashScreen控件
然后再拖拽一个label和MarqueeProgressBarControl控件
然后打开其代码页面,编辑其代码为
public partial class FrmProgressBar : SplashScreen { #region 单例实现 private static string _lockFlag = "FrmProgressBarLock"; private static FrmProgressBar _instance = null; /// <summary> /// 进度条窗口实例 /// </summary> public static FrmProgressBar Instance { get { lock(_lockFlag) { if (_instance == null) { _instance = new FrmProgressBar(true); } else if (_instance.IsDisposed) { _instance = null; _instance = new FrmProgressBar(true); } return _instance; } } } #endregion #region 字段定义 private bool _isShowTitle = false; #endregion #region 构造方法 private FrmProgressBar() { InitializeComponent(); } private FrmProgressBar(bool isShowTitle) { InitializeComponent(); this._isShowTitle = isShowTitle; this.marqueeProgressBarControl1.Properties.ShowTitle = this._isShowTitle; } #endregion #region 属性定义 /// <summary> /// 是否显示标题 /// </summary> public bool IsShowTitle { get { return this._isShowTitle; } set { this._isShowTitle = value; this.marqueeProgressBarControl1.Properties.ShowTitle = this._isShowTitle; } } /// <summary> /// 提示文本 /// </summary> public string NotifyText { get { return this.labelControl2.Text; } set { this.labelControl2.Text = value; } } /// <summary> /// 进度值 /// </summary> public int ProgressValue { get { return (int)this.marqueeProgressBarControl1.EditValue; } set { this.marqueeProgressBarControl1.Text = String.Format("{0}%", value); } } #endregion #region Overrides public override void ProcessCommand(Enum cmd, object arg) { base.ProcessCommand(cmd, arg); } #endregion public enum SplashScreenCommand { } }
调用进度条窗体
需要新开一个线程去执行进度条所代表的任务,在触发进度条的事件中
BackgroundWorker bgWorker = new BackgroundWorker();
并且设置其是否报告进度属性为true
bgWorker.WorkerReportsProgress = true;
然后绑定具体的进度条所代表的任务
bgWorker.DoWork -= backgroundWorker1_DoWork;
bgWorker.DoWork += backgroundWorker1_DoWork;
在此绑定的方法中就会执行具体的任务
然后设置任务进度改变的事件绑定
bgWorker.ProgressChanged -= bgWorker_ProgressChanged;
bgWorker.ProgressChanged += bgWorker_ProgressChanged;
在此方法中进行进度条进度与任务执行进度的绑定
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.ProgressPercentage >= 0 && e.ProgressPercentage <= 100) { Dialog.FrmProgressBar.Instance.ProgressValue = e.ProgressPercentage; } }
然后设置任务执行完之后关闭进度条窗口
bgWorker.RunWorkerCompleted -= bgWorker_RunWorkerCompleted;
bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
在执行完的方法中
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Dialog.FrmProgressBar.Instance.Dispose(); //关闭进度对话框 }
然后开始执行后台操作
bgWorker.RunWorkerAsync();
然后最后让进度条窗体显示
Dialog.FrmProgressBar.Instance.ShowDialog();
需要注意的是:
在DoWork 中绑定的具体的执行的任务中一定是佷费时间的任务,如果就是简单的
几个for循环,那么会看不到效果,因为这两个线程没有时间差,所以会同时显示与关闭。
所以在具体执行的后台任务中要执行有时间差的任务,比如读取大数据量文件。
并且在执行此任务时要根据执行的任务进度去进行报告。
在DoWork绑定的方法中
BackgroundWorker bgWorker = sender as BackgroundWorker; 。。。 bgWorker.ReportProgress(10); //10% 。。。 bgWorker.ReportProgress(65); 。。。 bgWorker.ReportProgress(100);
完整示例代码
//创建新的后台线程 BackgroundWorker bgWorker = new BackgroundWorker(); //设置线程是否报告进度为true bgWorker.WorkerReportsProgress = true; //绑定具体的后台任务的方法,在此方法中会报告进度 bgWorker.DoWork -= backgroundWorker1_DoWork; bgWorker.DoWork += backgroundWorker1_DoWork; //当进度改变时事件绑定,将绑定的进度作为进度条的进度 bgWorker.ProgressChanged -= bgWorker_ProgressChanged; bgWorker.ProgressChanged += bgWorker_ProgressChanged; //后台线程执行完事件绑定,会关闭进度条窗口 bgWorker.RunWorkerCompleted -= bgWorker_RunWorkerCompleted; bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted; //开始执行后台操作 bgWorker.RunWorkerAsync(); //显示进度条窗口 Dialog.FrmProgressBar.Instance.ShowDialog();
执行后台任务的方法
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker bgWorker = sender as BackgroundWorker; List<Cycle> cycles = null; List<Step> steps = null; List<Record> mainRecords = null; bgWorker.ReportProgress(10); //10% #region 加载循环数据 string cycleDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.CYCLE_EXT); if (System.IO.File.Exists(cycleDataFile)) { using (System.IO.Stream fs = new System.IO.FileStream(cycleDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { cycles = ProtoBuf.Serializer.Deserialize<List<Cycle>>(fs); } } bgWorker.ReportProgress(40); #endregion #region 加载工步数据 string stepDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.STEP_EXT); if (System.IO.File.Exists(stepDataFile)) { using (System.IO.Stream fs = new System.IO.FileStream(stepDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { steps = ProtoBuf.Serializer.Deserialize<List<Step>>(fs); } } bgWorker.ReportProgress(70); #endregion #region 加载主通道数据 string mainRecordDataFile = String.Format("{0}{1}", Global.Instance.CurrDataFile, Global.MAIN_EXT); if (System.IO.File.Exists(mainRecordDataFile)) { using (System.IO.Stream fs = new System.IO.FileStream(mainRecordDataFile, System.IO.FileMode.Open, System.IO.FileAccess.Read)) { mainRecords = ProtoBuf.Serializer.Deserialize<List<Record>>(fs); } } #endregion bgWorker.ReportProgress(100); }
后台任务进度改变事件
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.ProgressPercentage >= 0 && e.ProgressPercentage <= 100) { Dialog.FrmProgressBar.Instance.ProgressValue = e.ProgressPercentage; } }
后台任务执行完毕事件
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Dialog.FrmProgressBar.Instance.Dispose(); //关闭进度对话框 }
原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11882943.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL8.0.21——错误日志中的组复制系统消息
- 【一】、搭建Hadoop环境----本地、伪分布式
- 在组复制中指定恢复IP地址
- START GROUP_REPLICATION可以将恢复凭据作为参数
- MySQL Shell转储和加载第1部分:演示!
- MySQL Shell转储和加载第2部分:基准测试
- MySQL Shell转储和加载第3部分:加载转储
- Hadoop【单机安装-测试程序WordCount】
- MySQL Shell转储和加载第4部分:转储实例和模式
- 【创建模式】--工厂模式
- 【创建模式】--Singleton
- Mapreduce 历史服务 配置启动查看
- Yarn 的日志聚集功能配置使用
- HDFS 的垃圾回收配置
- 配置SSH无密码登录