首页 新闻 会员 周边 捐助

WINFORM状态栏中进度条的处理问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-10-17 11:21

各位博友好!

现在我想实现这样的功能:窗体状态栏中有个进度条,我想要他显示处理某个事件或者加载某个事项时的进度,我该如何处理呢?

在线等,知道的大大们就不要藏了,给我个DEMO或者介绍个网站、文章都可以的。

失落の熊熊的主页 失落の熊熊 | 初学一级 | 园豆:79
提问于:2012-09-28 12:13
< >
分享
最佳答案
0

最好使用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,在你加载完毕后执行什么.

以上

收获园豆:5
Tetian | 菜鸟二级 |园豆:214 | 2012-09-28 16:47

不知道你自己测试过没有,反正我是测试过了,不行的。

失落の熊熊 | 园豆:79 (初学一级) | 2012-09-28 17:09

@失落の熊熊: 竟然不能上传图片.杯具的.我之前写的代码有的地方 少括号什么.手打出来的伤不起啊.

我写了一个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 | 园豆:214 (菜鸟二级) | 2012-09-28 17:37

@Tetian: 哦,不好意思,对比了下,有句重要的没体现之前:bgwConnect.ReportProgress(j / 100);

Tetian | 园豆:214 (菜鸟二级) | 2012-09-28 17:40

@Tetian: 至于这个值怎么获得,自己想.各种加载事件什么的获取不同,例如加载网页,或用用时间差什么的.

Tetian | 园豆:214 (菜鸟二级) | 2012-09-28 17:43
其他回答(2)
0

一般需要进度条的,肯定是要显示一些密集型计算的状态,一般会使用异步去实现。

你可以使用委托及控件的beginInvoke去做异步计算,去更新UI

收获园豆:2
Ethan轻叹 | 园豆:996 (小虾三级) | 2012-09-28 12:35
1

三个方法,1.你执行的事件会提供给你有委托,用委托去加载progressbar ,2.开一个线程,在你去执行你的事件是线程启动调用进度条事件   3.做一个假进度条  希望楼主能懂

收获园豆:3
hellohello-tom | 园豆:329 (菜鸟二级) | 2012-09-28 14:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册