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.csdn.net/download/gentelwind/12919311

如果想要在进度条末端显示百分比,可以通过自定义 ProgressBar 的绘制方式来实现。具体做法如下: 1. 在窗体上添加一个 ProgressBar 控件和一个 Label 控件,设置 ProgressBar 的 Style 属性为 ProgressBarStyle.Continuous,Label 控件用于显示进度百分比。 2. 在窗体的 Load 事件添加以下代码: ```csharp private void Form1_Load(object sender, EventArgs e) { // 设置 ProgressBar 的最大值和初始值 progressBar1.Maximum = 100; progressBar1.Value = 0; // 设置 ProgressBar 的 Style 为 Continuous progressBar1.Style = ProgressBarStyle.Continuous; } ``` 3. 重写 ProgressBar 的 Paint 方法,绘制进度条末端的百分比。代码如下: ```csharp private void progressBar1_Paint(object sender, PaintEventArgs e) { // 获取 ProgressBar 上下文 var g = e.Graphics; // 获取 ProgressBar 客户区域 var rect = progressBar1.ClientRectangle; // 计算进度条的宽度 var progressBarWidth = (int)(rect.Width * ((double)progressBar1.Value / progressBar1.Maximum)); // 绘制进度条 var progressBarRect = new Rectangle(rect.X, rect.Y, progressBarWidth, rect.Height); g.FillRectangle(Brushes.Green, progressBarRect); // 绘制进度百分比 var percent = (int)(((double)progressBar1.Value / progressBar1.Maximum) * 100); var percentText = $"{percent}%"; var textSize = g.MeasureString(percentText, progressBar1.Font); var textX = rect.X + progressBarWidth - (int)textSize.Width; var textY = rect.Y + (rect.Height - (int)textSize.Height) / 2; var textPoint = new PointF(textX, textY); g.DrawString(percentText, progressBar1.Font, Brushes.White, textPoint); } ``` 在上面的代码,我们首先获取 ProgressBar 的客户区域和当前进度条的宽度,然后绘制进度条。接着计算进度百分比并绘制在进度条末端。最后在窗体的 Load 事件将 Paint 事件和 ProgressBar 控件关联即可。 这样就可以实现进度条末端显示百分比的效果了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值