首页 > 学院 > 开发设计 > 正文

【Winform】使用BackgroundWorker控制进度条显示进度

2019-11-14 14:02:27
字体:
来源:转载
供稿:网友

许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单。。。看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu.com/s/1dDIxHvz

BackgroundWorker可以在代码中创建,也可以在工具箱中拖,但如果要使用,必须将其的WorkerReportsPRogress属性设置为True!

这个Demo是一个复制文件的,为了效果更明显,建议复制的文件多一点,方便进度条显示。

界面如下:

下面是全部代码:

 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks;10 using System.Windows.Forms;11 12 namespace Demo_ProgressBar13 {14      public partial class Form1 : Form15      {16           public Form1()17           {18                InitializeComponent();19           }20 21           string[] fileNames = null;//存储文件路径22           string savePath = null;//存储保存路径23 24           private void btnChooseFiles_Click(object sender, EventArgs e)//添加文件到listBox25           {26                OpenFileDialog o = new OpenFileDialog();//打开文件对话框的对象27                o.Multiselect = true;//文件可以多选28                o.ShowDialog();29                if (o.FileNames == null)//如果没有选择文件30                {31                     return;32                }33                else34                {35                     fileNames = o.FileNames;36                     for (int i = 0; i < fileNames.Length; i++)37                     {38                          if (!lstbxShowFiles.Items.Contains(fileNames[i]))//如果列表中不包含元素才添加39                          {40                               lstbxShowFiles.Items.Add(fileNames[i]);41                          }42                     }43                }44           }45 46           private void btnChooseSavePath_Click(object sender, EventArgs e)//选择保存路径47           {48                FolderBrowserDialog f = new FolderBrowserDialog();//选择路径49                f.ShowDialog();50                if (f.SelectedPath == null)51                {52                     return;53                }54                else55                {56                     txtSavePath.Text = savePath = f.SelectedPath;57                }58           }59 60           private void btnStart_Click(object sender, EventArgs e)//开始复制61           {62                prgrsbr1.Maximum = lstbxShowFiles.Items.Count;//让进度条的最大值等于列表中要复制的文件的数目63                for (int i = 0; i < lstbxShowFiles.Items.Count; i++)64                {65                     using (FileStream fsRead = new FileStream(fileNames[i], FileMode.OpenOrCreate, Fileaccess.Read))//读取文件流66                     {67                          using (FileStream fsWrite = new FileStream(savePath + "//" + Path.GetFileName(fileNames[i]), FileMode.OpenOrCreate, FileAccess.Write))//写入文件流68                          {69                               byte[] buffer = new byte[1];70                               while (fsRead.Read(buffer, 0, buffer.Length) != 0)//返回值为零表示读完71                               {72                                    fsWrite.Write(buffer, 0, buffer.Length);73                               }74                          }75                     }76                     bckgrdwkrReport.ReportProgress(i + 1);//报告进度,触发ProgressChanged事件77                }78                prgrsbr1.Value = 0;79                MessageBox.Show("复制成功");80                lstbxShowFiles.Items.Clear();81                txtSavePath.Clear();82                fileNames = null;83                savePath = null;84           }85 86           private void bckgrdwkrReport_ProgressChanged(object sender, ProgressChangedEventArgs e)87           {88                prgrsbr1.Value = e.ProgressPercentage;//e.ProgressPercentage:ReportProgress方法传递的参数89           }90      }91 }

主要用到BackgroundWorker是在第60行的方法。(不知道前两个方法的自行百度。。。不知using()和FileStream的自行百度)

 

在62行,我们让进度条的最大值等于列表中要复制的文件的数目,这样每复制完一个文件就在76行用ReportProgress方法报告进度并触发BackgroundWorker的ProgressChanged事件,通过事件的参数e.ProgressPercentage可以获取ReportProgress方法中的参数。

 

当然,BackgroundWorker还有其他的方法和事件,可以自己去尝试,但一般只用到ReportProgress方法和ProgressChanged事件。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表