許多開發者看見一些軟件有進度條顯示進度,自己想弄,項目建好後發現並沒有自己想象中的那麼簡單。。。看了網上很多教程後,寫了一個小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_ProgressBar 13 { 14 public partial class Form1 : Form 15 { 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)//添加文件到listBox 25 { 26 OpenFileDialog o = new OpenFileDialog();//打開文件對話框的對象 27 o.Multiselect = true;//文件可以多選 28 o.ShowDialog(); 29 if (o.FileNames == null)//如果沒有選擇文件 30 { 31 return; 32 } 33 else 34 { 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 else 55 { 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事件。