C#实现进度条显示 - 独立窗体

C#实现进度条显示 - 独立窗体

  1. C#处理多条数据时,需要使用进度条告诉用户当前进度
  2. 使用独立窗体的进度条可以在程序中随时调用

首先,上图
在这里插入图片描述
点击“显示进度”按钮,即可调出进度条窗体。

  1. 首先做进度条界面,一个Label和一个ProgressBar
    主要方法如下

     public void SetStatus(string msg)
     {
         if (this.label1.InvokeRequired)
             this.label1.Invoke(new Action<string>(SetStatus), msg);
         else
             this.label1.Text = msg;
     }
    
     public void SetProgress(int value)
     {
         if (this.progressBar1.InvokeRequired)
             this.label1.Invoke(new Action<int>(SetProgress), value);
         else
             this.progressBar1.Value = value < 0 ? 0 : value > 100 ? 100 : value;
    
         // if (value == 100) this.Invoke(new Action(this.Hide));
    
         this.Refresh();
     }
    
  2. 编写进度窗体控制类,外部调用使用这个类进行操作,不直接调用进度条窗体。使用BackgroundWorker做纤细传递和处理的媒介。主要代码如下:

     public void DoIt()
     {
         if (worker == null && worker.IsBusy) return;
    
         worker.RunWorkerAsync();
    
         _PrgressForm.ShowDialog();
     }
     public void DoIt(object o)
     {
         if (worker == null && worker.IsBusy) return;
    
         worker.RunWorkerAsync(o);
    
         _PrgressForm.ShowDialog();
     }
    
     public void Abort()
     {
         worker.CancelAsync();
     }
    
     private void ProgressComplete(object sender, RunWorkerCompletedEventArgs e)
     {
         if (this._PrgressForm != null)
         {
             _PrgressForm.SetStatus("");
             _PrgressForm.SetProgress(0);
             this._PrgressForm.Dispose();
         }
     }
     private void ProgressChanged(object sender, ProgressChangedEventArgs e)
     {
         string message = e.UserState as string;
    
         if (message.StartsWith("ERROR:"))
         {
             _PrgressForm.RaiseError(message.Substring(6));
         }
         else if (message.StartsWith("INFORM:"))
         {
             _PrgressForm.RaiseInform(message.Substring(7));
         }
         else
         {
             _PrgressForm.SetStatus(message);
             _PrgressForm.SetProgress(e.ProgressPercentage);
         }
     }
    
     public void Dispose()
     {
         _PrgressForm.Dispose();
         _PrgressForm = null;
    
         worker = null;
     }
    
  3. 这样,进度条窗体已经完成,那么调用的时候如下:

     private void btnShowProgress_Click(object sender, EventArgs e)
     {
         using (ProgressHolder holder =new 		   ProgressHolder(DoWork,"测试进度条显示"))
         {
             holder.DoIt(500);
         }
     }
    
     private void DoWork(object sender, DoWorkEventArgs e)
     {
         BackgroundWorker worker = sender as BackgroundWorker;
         int max = (int)e.Argument;
    
         for (int i = 0; i < max; i++)
         {
             worker.ReportProgress((int)((double)i / max * 100), "正在处理第 " + i + " 条数据,请等待...");
    
             Thread.Sleep(5);
         }
     }
    

点击按钮后,就可以出现如图所示的进度显示啦!

有需要的朋友可以去下链接下载哦,支持一下吧!
https://download.youkuaiyun.com/download/gentelwind/12919311

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值