您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> .NET >> progressbar c# progressBar使用

progressbar c# progressBar使用

来源:网络整理     时间:2016/6/18 8:34:59     关键词:progressbar

关于网友提出的“progressbar c# progressBar使用”问题疑问,本网通过在网上对“progressbar c# progressBar使用”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题:progressbar c# progressBar使用
描述:

我要上传一个大文件,由于时间很长,不知道什么时候结束。C#中怎么样使用progressBar能够知道现在上传文件的进度呢?


解决方案1:

前几天刚用过,修改了一下,参考了一位前辈的例子
http://blog.mylover.cn/2009/02/post-3.html


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 TestProgressBar
{
    public partial class TestForm : Form
    {
        //线程开始的时候调用的委托
        private delegate void maxValueDelegate(WordEventArgs e);
        //线程执行中调用的委托
        private delegate void nowValueDelegate(WordEventArgs e);
        //线程执行结束调用的委托
        private delegate void endValueDelegate(WordEventArgs e);
        public TestForm()
        {
            InitializeComponent();
        }
        private void btn_Test_Click(object sender, EventArgs e)
        {
            Worker worker = new Worker();
            /// 订阅事件
            worker.OnStartWorkEvent += new WorkEventHandler(this.OnStartWorkEventHandler);
            worker.OnDoWorkEvent += new WorkEventHandler(this.OnDoWorkEventHandler);
            worker.OnEndWorkEvent += new WorkEventHandler(this.OnEndWorkEventHandler);
            Thread thread = new Thread(new ThreadStart(worker.Work));
            thread.Start();  
        }
        /// 
        /// 线程开始事件,设置进度条最大值,需要一个委托来替我完成
        /// 

        /// 
        /// 
        void OnStartWorkEventHandler(object sender, WordEventArgs e)
        {            
            maxValueDelegate max = new maxValueDelegate(SetMaxValue);
            this.Invoke(max, e);
        }
        /// 
        /// 线程执行中的事件,设置进度条当前进度,需要一个委托来替我完成
        /// 

        /// 
        /// 
        void OnDoWorkEventHandler(object sender, WordEventArgs e)
        {           
            nowValueDelegate now = new nowValueDelegate(SetNowValue);
            this.Invoke(now, e);
        }
        /// 
        /// 线程完成事件
        /// 

        /// 
        /// 
        void OnEndWorkEventHandler(object sender, WordEventArgs e)
        {
            endValueDelegate end = new endValueDelegate(SetEndValue);
            this.Invoke(end, e);
        }
        /// 
        /// 被委托调用,专门设置进度条最大值的
        /// 

        /// 
        private void SetMaxValue(WordEventArgs e)
        {
            this.probar_Test.Maximum = e.Position;
            lbl_Info.Text = e.Info;
        }
        /// 
        /// 被委托调用,专门设置进度条当前值的
        /// 

        /// 
        private void SetNowValue(WordEventArgs e)
        {
            this.probar_Test.Value = e.Position;
            lbl_Info.Text = e.Info;
        }
        /// 
        /// 被委托调用,专门设置进度条结束后的处理
        /// 

        /// 
        private void SetEndValue(WordEventArgs e)
        {
            this.probar_Test.Value = e.Position; ;
            lbl_Info.Text = e.Info;
            MessageBox.Show(e.Info);           
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TestProgressBar
{
    public delegate void WorkEventHandler(object sender, WordEventArgs e);
    class Worker
    {
        /// 
        /// 开始事件
        /// 

        public event WorkEventHandler OnStartWorkEvent;
        /// 
        /// 执行时事件
        /// 

        public event WorkEventHandler OnDoWorkEvent;
        /// 
        /// 结束事件
        /// 

        public event WorkEventHandler OnEndWorkEvent;
        public Worker() 
        {  }
        private void SendEvents(WordEventArgs e)
        {
            switch (e.Stage)
            {
                case WorkStage.BeginWork:
                    if (OnStartWorkEvent != null) OnStartWorkEvent(this, e);
                    break;
                case WorkStage.DoWork:
                    if (OnDoWorkEvent != null) OnDoWorkEvent(this, e);
                    break;
                case WorkStage.EndWork:
                    if (OnEndWorkEvent != null) OnEndWorkEvent(this, e);
                    break;
                default:
                    if (OnDoWorkEvent != null) OnDoWorkEvent(this, e);
                    break;
            }
        }
        public void Work()
        {
            int iTotal = 100;//计算工作量,这里是设置为100,如果是上传,或者下载,就是文件的大小,循环遍历的话,这就是最大的那个循环数
            SendEvents(new WordEventArgs(WorkStage.BeginWork, "开始工作!", iTotal));
            int iCount = 0;
            for (int i = 0; i < iTotal; i++)
            {
                Thread.Sleep(50);//休息50毫秒,模拟执行大数据量操作,
                iCount = i; // 此处计算所处的位置,如果是上传或者下载了多少了,
                SendEvents(new WordEventArgs(WorkStage.DoWork, "正在工作ing " + iCount.ToString(), iCount));
            }
            SendEvents(new WordEventArgs(WorkStage.EndWork, "结束工作!", iTotal));
        }
    }
    class WordEventArgs : EventArgs
    {
        //主要是用来往外传递信息的
        public WorkStage Stage;
        public string Info = "";
        public int Position = 0;      
        public WordEventArgs(WorkStage Stage, string Info, int Position)
        {
            this.Stage = Stage;
            this.Info = Info;
            this.Position = Position;
        }
    }
    public enum WorkStage
    {
       BeginWork,  //准备工作
        DoWork,     //正在工作  
        EndWork,    //工作结束
    }
}
解决方案2:


//一个模拟.....也可能不适合你,不知道你的发送文件代码是怎么写的
    private void button3_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(Send));
        thread.Start();
    }
    private void Send()
    {
      int i = 0;
      while (i <= 100)
      {
         //显示进度 信息
        this.ShowPro(i);
        //循环发生文件
         //模拟的 
        i++; //模拟发送多少
        Thread.Sleep(100);
      }
      Thread.CurrentThread.Abort();
    }
    private void ShowPro(int value)
    {
      if (this.InvokeRequired)
      {
        this.Invoke(new ProgressBarShow(ShowPro), value);
      }
      else
      {
        this.progressBar1.Value = value;
        this.label1.Text = value + "%";
      }
    }

以上介绍了“progressbar c# progressBar使用”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/1749461.html

progressbar相关图片

progressbar相关文章