1.第一種方法:直接實現
(1)界面
(2)設計一個按鈕事件
-
private void button1_Click(object sender, EventArgs e)
-
{
-
progressBar1.Value = 0; //清空進度條
-
for (int i = 0; i < 100; i++)
-
{
-
progressBar1.Value += 1;
-
textBox1.AppendText( "當前進度:%" + i.ToString() + "\r\n");
-
Thread.Sleep( 50);
-
}
-
-
}
結果為:
2.第二種方法:子窗體實現
(1)先定義一個進度條窗體progressForm.cs,添加函數
-
public void AddProgress()
-
{
-
progressBar1.Value++;
-
label1.Text = progressBar1.Value.ToString() + "%";
-
label1.Refresh();
(2)主窗體添加一個按鈕事件
-
private void button1_Click(object sender, EventArgs e)
-
{
-
progressForm progress = new progressForm();
-
progress.Show();
-
for (int i = 0; i < 100; i++)
-
{
-
progress.AddProgress();
-
Thread.Sleep( 50); // 毫秒ms
-
}
-
progress.Close();
-
-
}
結果如下:
(3)第三種方法:線程實現
效果如下:
步驟如下:
首先定義一個代理用於更新ProgressBar的值(Value)及在執行方法的時候,返回方法的處理信息。
private delegate void SetPos(int ipos,string vinfo);//代理
相關實現函數如下
-
private void button1_Click(object sender, EventArgs e)
-
{
-
Thread fThread = new Thread(new ThreadStart(SleepT));
-
fThread.Start();
-
}
-
-
//定義新的線程執行函數
-
private void SleepT()
-
{
-
for (int i = 0; i < 500; i++) //滾動條最大值為500
-
{
-
System.Threading.Thread.Sleep( 10);
-
SetTextMsg( 100 * i / 500, i.ToString() + "\r\n");
-
}
-
}
-
-
//進度條值更新函數(參數必須跟聲明的代理參數一樣)
-
private void SetTextMsg(int ipos, string vinfo)
-
{
-
if (this.InvokeRequired) //InvokeRequired屬性為真時,說明一個創建它以以外的線程(即SleepT)想訪問它
-
{
-
SetPos setpos = new SetPos(SetTextMsg);
-
this.Invoke(setpos, new object[] { ipos, vinfo });//SleepT線程調用本控件Form1中的方法
-
}
-
else
-
{
-
this.label1.Text = ipos.ToString() + "/100";
-
this.progressBar1.Value = Convert.ToInt32(ipos);
-
this.textBox1.AppendText(vinfo);
-
}
-
}
以上三種情況都會產生程序假死,即在進度條運行時不能點擊。
4.第四種方法:BackgroundWorker控件實現,不會假死
BackgroundWorker可在單獨的線程上執行操作
步驟如下:
(1)主窗體設計,為主窗體添加一個BackgroundWorker控件和按鈕控件
(2)主窗體后台代碼Form1.cs
-
namespace progress_backgroundworker
-
{
-
public partial class Form1 : Form
-
{
-
public Form1()
-
{
-
InitializeComponent();
-
this.backgroundWorker1.WorkerReportsProgress = true; //設置能報告進度更新
-
this.backgroundWorker1.WorkerSupportsCancellation = true; //設置支持異步取消
-
}
-
-
private void button1_Click(object sender, EventArgs e)
-
{
-
this.backgroundWorker1.RunWorkerAsync(); //運行backgroundWorker組件
-
ProgressForm form = new ProgressForm(this.backgroundWorker1); //顯示進度條窗體
-
form.ShowDialog( this);
-
form.Close();
-
}
-
-
//在另一個線程上開始運行(處理進度條)
-
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
-
{
-
BackgroundWorker worker = sender as BackgroundWorker;
-
for (int i = 0; i < 100; i++)
-
{
-
System.Threading.Thread.Sleep( 100);
-
worker.ReportProgress(i);
-
if (worker.CancellationPending) //獲取程序是否已請求取消后台操作
-
{
-
e.Cancel = true;
-
break;
-
}
-
}
-
}
-
-
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
-
{
-
if (e.Error != null)
-
{
-
MessageBox.Show(e.Error.Message);
-
}
-
else if (e.Cancelled)
-
{
-
MessageBox.Show( "取消");
-
}
-
else
-
{
-
MessageBox.Show( "完成");
-
}
-
}
-
-
-
-
}
-
}
(3)子窗體設計
(4)子窗體代碼實現ProgressForm.cs
-
namespace progress_backgroundworker
-
{
-
public partial class ProgressForm : Form
-
{
-
private BackgroundWorker backgroundWorker1; //ProgressForm窗體事件(進度條窗體)
-
-
public ProgressForm(BackgroundWorker bgWork)
-
{
-
InitializeComponent();
-
// add my code
-
this.backgroundWorker1 = bgWork;
-
//綁定進度條改變事件
-
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
-
//綁定后台操作完成,取消,異常時的事件
-
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
-
}
-
-
-
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
-
{
-
this.progressBar1.Value = e.ProgressPercentage; //獲取異步任務的進度百分比
-
}
-
-
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
-
{
-
//this.Close(); //執行完之后,直接關閉頁面
-
}
-
-
//取消
-
private void btnCancel_Click(object sender, EventArgs e)
-
{
-
this.backgroundWorker1.CancelAsync(); //請求取消掛起的后台操作
-
this.btnCancel.Enabled = false;
-
this.Close();
-
}
-
}
-
}
效果如下
更多內容見參考資料
https://blog.csdn.net/ym296900664/article/details/52192289
https://www.cnblogs.com/xwzLoveCshap/p/9271592.html
圓形進度條實現
https://jingyan.baidu.com/article/eae0782742aa9d1fec54852f.html