各位博友好!
现在我想实现这样的功能:窗体状态栏中有个进度条,我想要他显示处理某个事件或者加载某个事项时的进度,我该如何处理呢?
在线等,知道的大大们就不要藏了,给我个DEMO或者介绍个网站、文章都可以的。
最好使用BackgroundWorker,简单易懂.
例子:
private BackgroundWorker bgwConnect; //初始化BGW
private InitBgw { bgwConnect = new BackgroundWorker(); bgwConnect.WorkerSupportsCancellation = true;//允许中止
bgwConnect.WorkerReportsProgress = true;//允许报告进度-这里就是你需要的
bgwConnect.DoWork += new DoWorkEventHandler(bgwConnect_DoWork); bgwConnect.ProgressChanged += new ProgressChangedEventHandler(bgwConnect_ProgressChanged);
}
private void bgwConnect_DoWork(object sender, DoWorkEventArgs e)
{
//你执行的事件或加载什么
}
private void bgwConnect_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pBConnect.Value = e.ProgressPercentage;//PBConnect是你定义的ProgressBar,一般这里就可以的,如有问题用下面的
//ChangePB( e.ProgressPercentage);//这里是为了防止和UI线程冲突而用.
}
private void delegate ChangePBDg(int per);
private void ChangePB(int per)
{
if(pBConnect.InvokeRequired)
{
ChangePBDg d = ChangePB;
pBConnect.Invoke(d, per);
}
else
{
pBConnect.Value=per;
}
}
还有个RunWorkerCompleted,在你加载完毕后执行什么.
以上
不知道你自己测试过没有,反正我是测试过了,不行的。
@失落の熊熊: 竟然不能上传图片.杯具的.我之前写的代码有的地方 少括号什么.手打出来的伤不起啊.
我写了一个DEMO运行没问题. 你把代码COPY到一个例子里面跑吧
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace PBtest { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitBgw(); bgwConnect.RunWorkerAsync(); } private BackgroundWorker bgwConnect; //初始化BGW private void InitBgw() { bgwConnect = new BackgroundWorker(); bgwConnect.WorkerSupportsCancellation = true;//允许中止 bgwConnect.WorkerReportsProgress = true;//允许报告进度-这里就是你需要的 bgwConnect.DoWork += new DoWorkEventHandler(bgwConnect_DoWork); bgwConnect.ProgressChanged += new ProgressChangedEventHandler(bgwConnect_ProgressChanged); } private void bgwConnect_DoWork(object sender, DoWorkEventArgs e) { for (int j = 0; j < 10000; j++) { Thread.Sleep(1); bgwConnect.ReportProgress(j / 100); } } private void bgwConnect_ProgressChanged(object sender, ProgressChangedEventArgs e) { pBConnect.Value = e.ProgressPercentage;//PBConnect是你定义的ProgressBar,一般这里就可以的,如有问题用下面的 //ChangePB( e.ProgressPercentage);//这里是为了防止和UI线程冲突而用. } private delegate void ChangePBDg(int per); private void ChangePB(int per) { if (pBConnect.InvokeRequired) { ChangePBDg d = ChangePB; pBConnect.Invoke(d, per); } else { pBConnect.Value = per; } } } }
@Tetian: 哦,不好意思,对比了下,有句重要的没体现之前:bgwConnect.ReportProgress(j / 100);
@Tetian: 至于这个值怎么获得,自己想.各种加载事件什么的获取不同,例如加载网页,或用用时间差什么的.
一般需要进度条的,肯定是要显示一些密集型计算的状态,一般会使用异步去实现。
你可以使用委托及控件的beginInvoke去做异步计算,去更新UI
三个方法,1.你执行的事件会提供给你有委托,用委托去加载progressbar ,2.开一个线程,在你去执行你的事件是线程启动调用进度条事件 3.做一个假进度条 希望楼主能懂