程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【WInform】使用BackgroundWorker控制進度條顯示進度,backgroundworker

【WInform】使用BackgroundWorker控制進度條顯示進度,backgroundworker

編輯:C#入門知識

【WInform】使用BackgroundWorker控制進度條顯示進度,backgroundworker


許多開發者看見一些軟件有進度條顯示進度,自己想弄,項目建好後發現並沒有自己想象中的那麼簡單。。。看了網上很多教程後,寫了一個小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事件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved