C#进度框
1、方法一:使用线程
功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。
第一步:设计界面,注意需要引用 using System.Threading;
第二步:定义一个代理,用于更新ProgressBar的值(Value)及在执行方法的时候,返回方法的处理信息。
private delegate void SetPos(int ipos,string vinfo);//代理
第三步:进度条值更新函数(参数必须跟声明的代理参数一样)
private void SetTextMesssage(int ipos,string vinfo)
{
if (this.InvokeRequired)
{
SetPos setpos = new SetPos(SetTextMesssage);
this.Invoke(setpos, new object[] { ipos,vinfo });
}
else
{
this.label1.Text = ipos.ToString() + "/1000";
this.progressBar1.Value = Convert.ToInt32(ipos);
this.textBox1.AppendText(vinfo);
}
}
第四步:函数实现
private void button1_Click(object sender, EventArgs e)
{
Thread fThread = new Thread(new ThreadStart(SleepT));
fThread.Start();
}
第五步:新的线程执行函数:
private void SleepT()
{
for (int i = 0; i < 500; i++)
{
System.Threading.Thread.Sleep(10);
SetTextMesssage(100*i/500,i.ToString()+"\r\n");
}
}
程序运行效果图:
控件名称:
button1;backgroundWorker1;
对backgroundWorker1控件,属性设置:
第二步:主页面后台代码:
using System.Threading;//引用空间名称
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
}
else
{
}
}
//你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
worker.ReportProgress(i);
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
}
}
}
分别为button控件和backgroundWorker1控件选好事件。
第三步:设置子窗体(及显示进度条的窗体):
private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)
public ProcessForm(BackgroundWorker backgroundWorker1)
{
InitializeComponent();
this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//this.Close();//执行完之后,直接关闭页面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.button1.Enabled = false;
this.Close();
}
}
只为button选好事件
执行效果为:
=================================================================================================
3、第三种方法:
功能描述:在处理大量数据的时候,有时候方法的执行需要一定的时间,这时候往往会造成页面或程序的“假死”状态,给用户的体验度也不是很好。为了避免出现“假死”提高用户的体验度,在这里为这类型的方法加了一个进度条和一个文本框,进度条用于显示程序处理的进度,文本框用于显示在处理过程中,给与的提示。本方法主要使用了控件:backgroundWorker1;说明:本方法与上面的方法(方法二)基本类型,主要是设计和代码进行了一些修改。
第一步:主窗体设计:
控件名称:
button1;backgroundWorker1;
对backgroundWorker1控件,属性设置:
第二步:主窗体 后台代码:
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
}
else
{
}
}
//你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100);
worker.ReportProgress(i, i.ToString() + " 你好!\r\n"); //注意:这里向子窗体返回信息值,这里是两个值,一个用于进度条,一个用于文本框的。
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
}
}
}
第三步:设置子窗体(及显示进度条的窗体):
控件:
progressBar1;textBox1;button1
第四步:子窗体后台代码:
private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)
public ProcessForm(BackgroundWorker backgroundWorker1)
{
InitializeComponent();
this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//this.Close();//执行完之后,直接关闭页面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.textBox1.AppendText(e.UserState.ToString());//主窗体传过来的值,通过e.UserState.ToString()来接受
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.button1.Enabled = false;
this.Close();
}
实现的效果:
{
this.progressBar1.Value = e.ProgressPercentage;
this.textBox1.Text += e.UserState.ToString(); //主窗体传过来的值,通过e.UserState.ToString()来接受
}
private delegate bool IncreaseHandle(int nValue,string vinfo);//代理创建
private IncreaseHandle myIncrease = null;//声明代理,用于后面的实例化代理
private int vMax = 100;//用于实例化进度条,可以根据自己的需要,自己改变
{
Thread thdSub = new Thread(new ThreadStart(ThreadFun));
thdSub.Start();
}
{
MethodInvoker mi = new MethodInvoker(ShowProcessBar);
this.BeginInvoke(mi);
object objReturn = null;
for (int i = 0; i < vMax; i++)
{
objReturn = this.Invoke(this.myIncrease, new object[] { 2, i.ToString() + "\r\n" });
Thread.Sleep(50);
}
}
{
myProcessBar = new Form6(vMax);
myIncrease = new IncreaseHandle(myProcessBar.Increase);
myProcessBar.ShowDialog();
myProcessBar = null;
}
控件名称:
{
InitializeComponent();
}
{
if (nValue > 0)
{
if (progressBar1.Value + nValue < progressBar1.Maximum)
{
progressBar1.Value += nValue;
this.textBox1.AppendText(nInfo);
Application.DoEvents();
progressBar1.Update();
progressBar1.Refresh();
this.textBox1.Update();
this.textBox1.Refresh();
return true;
}
else
{
progressBar1.Value = progressBar1.Maximum;
this.textBox1.AppendText(nInfo);
//this.Close();//执行完之后,自动关闭子窗体
return false;
}
}
return false;
}
C#进度框的更多相关文章
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- 解决“每次打开office2010的word都会出现配置进度框”问题
在win7中安装完office2010后.打开 *.doc文件时,总会弹出"配置进度框"问题,解决例如以下: 1)点击"開始"-->"执 ...
- 解决Office 2010 每次打开word时出现配置进度框
来自百度经验 装好Office 2010后,每次打开都会出现配置进度框,很烦人,怎么办呢 确认你的10版Office已激活,激活状态如图(激活工具一般在你下载的安装包里都有) 直接在”开始“运行框里输 ...
- Android--创建进度框ProgressDialog
1.布局文件progress_dialog_activity.xml <?xml version="1.0" encoding="utf-8"?> ...
- Office 2007 打开时总是出现配置进度框
解决办法: cmd 打开控制台 输入命令:reg add HKCU\Software\Microsoft\Office\12.0\Word\Options /v NoReReg /t REG_DWOR ...
- [置顶] 安卓弹出ProgressDialog进度框之后触摸屏幕就消失了的解决方法
安卓在4.0之前对话框都是模态的,之后就改成非模态了. 解决方法吗,使用progressdialog.setCancelable(false)也行,但是这样就不能响应返回键的事件了,最好的方法是调用p ...
- (转载)Android自定义ProgressDialog进度等待框
Android自定义ProgressDialog进度等待框 作者:无缘公子 字体:[增加 减小] 类型:转载 时间:2016-01-11我要评论 这篇文章主要介绍了Android自定义Progress ...
- 通过DIV+span方式模拟进度条的实现方法
上上周用FusionCharts做报表时,有个图是进度条的形式,其实在FusionCharts 3.0之后已经支持了(Linear Gauge),可惜现有系统用的还是1.2.3版本的,重新引入新版本有 ...
- 【转】IOS学习笔记29—提示框第三方库之MBProgressHUD
原文网址:http://blog.csdn.net/ryantang03/article/details/7877120 MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单 ...
随机推荐
- Django1.10 release notes摘编
一.重点新特性: 1.面向PostgreSQL的全文搜索支持 2.新式风格的middleware 3.用户名Unicode编码的官方支持 二.一些可以提的改变: 1.用户名最大长度增加到150 2.不 ...
- 实验6 shell程序设计一(1)
设计如下一个菜单驱动程序 Use one of the following options: P:To display current directory S:To display the name ...
- Artwork
A template for an artwork is a white grid of n × m squares. The artwork will be created by painting ...
- SQLServer Merger Using语法使用和注意点
SQL多表关联数据更新,如果数据量比较少的情况下,用Update也是可以的:脚本如下: UPDATE NA_AgentGrpOrder SET AttrServSIItem=b.AttrValue F ...
- 使用Navicat for MySQL把本地数据库上传到服务器
服务器系统基本都是基于linux的,这个数据库上传的方式适用于linux的各种版本,比如Ubuntu和Centos(尽管这两个版本各种大坑小坑,但至少在数据库传输上保持了一致性) 当然本地数据库上传到 ...
- Yii2快速总结
1.项目目录 后面的总结都是基于这个项目目录,注意:这个Yii2框架的basic版本原始的目录结构,未作任何更改. 2.新建控制器以及视图 controllers这个目录下的SiteControlle ...
- hadoop is running beyond virtual memory limits问题解决
单机搭建了2.6.5的伪分布式集群,写了一个tf-idf计算程序,分词用的是结巴分词,使用standalone模式运行没有任何问题,切换到伪分布式模式运行一直报错: hadoop is running ...
- js实用技巧
IIFE(立即调用函数表达式)最广泛的用途是避免污染全局作用域. 已经有很多JavaScript库和JavaScript高手正在使用这种技巧, 尤其是在最流行jQuery插件的开发者中. 你也应该把这 ...
- JavaScript中对数组和数组API的认识
JavaScript中对数组和数组API的认识 一.数组概念: 数组是JavaScript中的一类特殊的对象,用一对中括号“[]”表示,用来在单个的变量中存储多个值.在数组中,每个值都有一个对应的不重 ...
- cocos2d-x 开发常见问题:
更改Andriod项目的显示横屏还是竖屏问题: 打开项目中的proj.android/AndroidManifest.xml文件中,更改screenOrientation配置信息: screenOri ...