ProgressBar控件(进度条)用于在win窗体中显示进度,由于它的值会不断更新,为了不让界面假死,一般都是采用多线程的方式对进度条进行管理。有关ProgressBar的理论基础跟详细知识我在这里不多说,官方文档上面都可以查阅参考。这篇随笔我就是简单演示一下对ProgressBar控件的简单使用。

先展示一下窗口界面:

左上角是两个ProgressBar,右上角按钮负责控制ProgressBar进度的开启。右下角的四个按钮看起来很熟悉是吧,因为这是在上一篇博文中所演示的Demo的基础上继续往后做的。

一、首先定义一个控制ProgressBar进度的委托方法,为什么要用委托呢?因为ProgressBar控件是由主线程创建的,而对ProgressBar的操作是放在一个子线程中的,这在后面的跨线程操作控件中需要用到委托方法。代码如下:

1 private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法

二、定义一个共通的方法,用于设置进度条的进度,代码如下:

 1 /// <summary>
2 /// 设置ProgressBar的进度。
3 /// </summary>
4 /// <param name="pro"></param>
5 /// <param name="proBar"></param>
6 private void SetProgressMessage(int pro, ProgressBar proBar)
7 {
8 //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
9 //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
10 //必须执行this.InvokeRequired进行判断。
11 if (this.InvokeRequired)
12 {
13 DelSetPro setPro = new DelSetPro(SetProgressMessage);
14 this.Invoke(setPro, new object[] { pro, proBar });
15 }
16 else
17 {
18 proBar.Value = Convert.ToInt32(pro);
19 }
20 }

设置ProgressBar进度

三、我希望ProgressBar的进度完成后,可以弹出一个确认窗口让我知道,并且确认后消失。这个跟设置ProgressBar的进度大同小异,只是具体的实现细节不一样。委托方法代码如下:

1 private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法

四、定义一个共通的方法,用于让进度条消失,代码如下:

 1 /// <summary>
2 /// 让控件ProgressBar消失。
3 /// </summary>
4 /// <param name="pro"></param>
5 private void SetProgressBarVisi(ProgressBar pro)
6 {
7 if (this.InvokeRequired)
8 {
9 DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
10 this.Invoke(setProVisi, new object[] { pro });
11 }
12 else
13 {
14 pro.Visible = false;
15 }
16 }

让进度条消失

五、接下就是对第一个进度条的具体操作了,在这个方法里会用到上面已经定义好的两个方法。请注意:ProgressBar的Maximum的默认值为100,Minimum的默认值为0,起初没注意Maximum,导致了超值异常。代码如下:

 1 /// <summary>
2 /// 操作ProgressBar01
3 /// </summary>
4 private void SleepForProgressBar01()
5 {
6 for (int i = 1; i <= 100; i++)
7 {
8 Thread.Sleep(100);
9 SetProgressMessage(i, progressBar1);
10 }
11 DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
12 if (dr01.Equals(DialogResult.OK))
13 {
14 SetProgressBarVisi(progressBar1);
15 }
16 }

操作ProgressBar01控件

六、对第二个ProgressBar02控件的具体操作跟上面差不多,只是具体的进度不一样。就不赘述了。下面就直接展示一下实现效果图:

七、上面的几个步骤我拆解得比较细一点,可能初看起来有点乱,还有具体的一些细节方面我暂时也没有考虑太多,目前只是单纯的简单上手,在代码的优化方面应该还可以做得更好一点。这个Demo比较简单的,下面我就贴上Form1.cs的所有代码,欢迎各位批评指正。代码如下:

  1 using System;
2 using System.Threading;
3 using System.Windows.Forms;
4 using WinFormsAppGame.Properties;
5
6 namespace WinFormsAppGame
7 {
8 public partial class Form1 : Form
9 {
10 private delegate void DelSetPro(int pro, ProgressBar proBar);//设置进度条进度的委托方法
11 private delegate void DelSetProVisi(ProgressBar proBar);//设置进度条消失的委托方法
12
13 /// <summary>
14 /// 设置ProgressBar的进度。
15 /// </summary>
16 /// <param name="pro"></param>
17 /// <param name="proBar"></param>
18 private void SetProgressMessage(int pro, ProgressBar proBar)
19 {
20 //如果当前调用方不是创建控件的一方,则需要使用this.Invoke()
21 //在这里,ProgressBar控件是由主线程创建的,所以子线程要对该控件进行操作
22 //必须执行this.InvokeRequired进行判断。
23 if (this.InvokeRequired)
24 {
25 DelSetPro setPro = new DelSetPro(SetProgressMessage);
26 this.Invoke(setPro, new object[] { pro, proBar });
27 }
28 else
29 {
30 proBar.Value = Convert.ToInt32(pro);
31 }
32 }
33
34 /// <summary>
35 /// 让控件ProgressBar消失。
36 /// </summary>
37 /// <param name="pro"></param>
38 private void SetProgressBarVisi(ProgressBar pro)
39 {
40 if (this.InvokeRequired)
41 {
42 DelSetProVisi setProVisi = new DelSetProVisi(SetProgressBarVisi);
43 this.Invoke(setProVisi, new object[] { pro });
44 }
45 else
46 {
47 pro.Visible = false;
48 }
49 }
50
51 /// <summary>
52 /// 操作ProgressBar01
53 /// </summary>
54 private void SleepForProgressBar01()
55 {
56 for (int i = 1; i <= 100; i++)
57 {
58 Thread.Sleep(10);
59 SetProgressMessage(i, progressBar1);
60 }
61 DialogResult dr01 = MessageBox.Show("ProgressBar01 has been finished!");
62 if (dr01.Equals(DialogResult.OK))
63 {
64 SetProgressBarVisi(progressBar1);
65 }
66 }
67
68 /// <summary>
69 /// 操作ProgressBar02
70 /// </summary>
71 private void SleepForProgressBar02()
72 {
73 for (int j = 1; j <= 100; j++)
74 {
75 Thread.Sleep(30);
76 SetProgressMessage(j, progressBar2);
77 }
78 DialogResult dr02 = MessageBox.Show("ProgressBar02 has been finished!");
79 if (dr02.Equals(DialogResult.OK))
80 {
81 SetProgressBarVisi(progressBar2);
82 }
83 }
84
85 /// <summary>
86 /// 监听方向键的KeyDown事件
87 /// </summary>
88 /// <param name="sender"></param>
89 /// <param name="e"></param>
90 private void Form1_KeyDown(object sender, KeyEventArgs e)
91 {
92 switch (e.KeyCode)
93 {
94 case Keys.Left:
95 buttonLeft.BackgroundImage = Resources.left;
96 break;
97 case Keys.Up:
98 buttonUP.BackgroundImage = Resources.up;
99 break;
100 case Keys.Right:
101 buttonRight.BackgroundImage = Resources.right;
102 break;
103 case Keys.Down:
104 buttonDown.BackgroundImage = Resources.down;
105 break;
106 }
107 }
108
109 /// <summary>
110 /// 监听方向键的KeyUp事件
111 /// </summary>
112 /// <param name="sender"></param>
113 /// <param name="e"></param>
114 private void Form1_KeyUp(object sender, KeyEventArgs e)
115 {
116 switch (e.KeyCode)
117 {
118 case Keys.Left:
119 buttonLeft.BackgroundImage = Resources.left_dark;
120 break;
121 case Keys.Up:
122 buttonUP.BackgroundImage = Resources.up_dark;
123 break;
124 case Keys.Right:
125 buttonRight.BackgroundImage = Resources.right_dark;
126 break;
127 case Keys.Down:
128 buttonDown.BackgroundImage = Resources.down_dark;
129 break;
130 }
131 }
132
133 /// <summary>
134 /// 重写ProcessDialogKey,来允许监听方向键
135 /// </summary>
136 /// <param name="keycode"></param>
137 /// <returns></returns>
138 protected override bool ProcessDialogKey(Keys keycode)
139 {
140 switch (keycode)
141 {
142 case Keys.Left:
143 case Keys.Up:
144 case Keys.Right:
145 case Keys.Down:
146 return false;
147 }
148 return true;
149 }
150
151 public Form1()
152 {
153 InitializeComponent();
154 this.KeyPreview = true;//让界面能够捕捉到键盘事件
155 //this.Cursor.Dispose();//在主界面中禁用鼠标
156 }
157
158 private void button1_Click(object sender, EventArgs e)
159 {
160 Thread pro01Thread = new Thread(new ThreadStart(SleepForProgressBar01));
161 Thread pro02Thread = new Thread(new ThreadStart(SleepForProgressBar02));
162 pro01Thread.Start();
163 pro02Thread.Start();
164 }
165 }
166 }

Form1.cs

以上!

C# ProgressBar的简单使用的更多相关文章

  1. android学习ProgressBar的简单使用

    android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...

  2. ProgressBar的简单使用

    当我们的应用在进行耗时操作时,显示一个进度条呈现给用户,让用户知道当前进度是一个很好的体验,接下来我们就来简单了解下ProgressBar(本文主要针对初学者,大神可以绕开啦),先看效果图: 进度条P ...

  3. Android 打造形形色色的进度条 实现可以如此简单

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重 ...

  4. Android进度条控件ProgressBar使用

    ProgressBar有四种样式,圆形的(大,中,小)和直条形的(水平) 对应的style为 <LinearLayout xmlns:android="http://schemas.a ...

  5. Android_自定义进度条

    转载:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的 ...

  6. Android简单自定义圆形和水平ProgressBar

    ProgressBar简介 继承于View类,直接子类有AbsSeekBar和ContentLoadingProgressBar,其中AbsSeekBar的子类有SeekBar和RatingBar,可 ...

  7. 最简单的耗时组件(窗口activity里面放一个progressBar)

    ①.先定义一个activity package com.example.administrator.actionbardemo; import android.app.Activity; import ...

  8. jqueryui组件progressbar进度条和日期组件datepickers的简单使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. jquery ui progressbar简单使用deom

    jquery api 和下载: http://api.jqueryui.com/progressbar/#option-value <!doctype html> <html lan ...

随机推荐

  1. 使用OpenFileDialog打开文件和使用FolderBrowserDialog选定文件夹

    选定文件夹 string foldPath = ""; FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog ...

  2. Java-在数组中遍历出最值

    在操作数组时,经常需要获取数组中元素的最值. 代码 public class Example31{ public static void main(String[] args){ int[] arr= ...

  3. SimpleDateFormat简介及替代方案

    简介 SimpleDateFormat是一个时间格式化工具,可以将字符串格式化时间Date类型,也可以将Date类型格式化为字符串String类型,但其线程不安全. 常用方法 public final ...

  4. NSString 类介绍及用法

    1.NSString常见方法 NSString是 Objective-C 中核心处理字符串的类之一 创建常量字符串,注意使用"@"符号. NSString *astring = @ ...

  5. kubeadm/flannel/dashboard/harbor部署以及服务发布

    kubeadm/flannel/dashboard/harbor部署以及服务发布 目录 kubeadm/flannel/dashboard/harbor部署以及服务发布 一.部署kubeadm 1. ...

  6. MSTP多生成树协议

    MSTP多生成树协议 目录 MSTP多生成树协议 1.MSTP(Multiple Spanning Tree Protocol)概述 2.STP.RSTP.PVST的应用缺陷 3.MSTP的主要特点 ...

  7. Redis性能管理

    Redis性能管理 目录 Redis性能管理 一.查看Redis内存使用 二.内存碎片率 三.内存使用率 四.避免内存交换发生的方法 1. Hash数据类型 1.1 HSET/HGET/HDEL/HE ...

  8. Vue小白练级之路---001表单验证功能的一般实现思路

    思路: 先各自验证 非空校验 具体规则校验 后兜底校验( 防止用户没输入信息直接登录 ) 实现:( 以 element-ui 为例 ) 在 标签上用 model 动态绑定收集数据的对象(form) 在 ...

  9. 9、Selenium grid2

    P228--Selenium Grid2 P233--Selenium Grid 工作原理 P236--Remote 应用 P246--WebDriver 驱动 driver = webdriver. ...

  10. 主机磁盘使用率超过85%导致es索引变为只读模式

    [ type=cluster_block_exception, reason=index [ index_name ] FORBIDDEN/12/index read-only / allow del ...