winform進度條的實現


1.第一種方法:直接實現

(1)界面

(2)設計一個按鈕事件

  1.  
    private void button1_Click(object sender, EventArgs e)
  2.  
    {
  3.  
    progressBar1.Value = 0; //清空進度條
  4.  
    for (int i = 0; i < 100; i++)
  5.  
    {
  6.  
    progressBar1.Value += 1;
  7.  
    textBox1.AppendText( "當前進度:%" + i.ToString() + "\r\n");
  8.  
    Thread.Sleep( 50);
  9.  
    }
  10.  
     
  11.  
    }

結果為:

2.第二種方法:子窗體實現

(1)先定義一個進度條窗體progressForm.cs,添加函數

  1.  
    public void AddProgress()
  2.  
    {
  3.  
    progressBar1.Value++;
  4.  
    label1.Text = progressBar1.Value.ToString() + "%";
  5.  
    label1.Refresh();

(2)主窗體添加一個按鈕事件

  1.  
    private void button1_Click(object sender, EventArgs e)
  2.  
    {
  3.  
    progressForm progress = new progressForm();
  4.  
    progress.Show();
  5.  
    for (int i = 0; i < 100; i++)
  6.  
    {
  7.  
    progress.AddProgress();
  8.  
    Thread.Sleep( 50); // 毫秒ms
  9.  
    }
  10.  
    progress.Close();
  11.  
     
  12.  
    }

結果如下:

 

(3)第三種方法:線程實現

效果如下:

步驟如下:

首先定義一個代理用於更新ProgressBar的值(Value)及在執行方法的時候,返回方法的處理信息。

        private delegate void SetPos(int ipos,string vinfo);//代理

相關實現函數如下

  1.  
    private void button1_Click(object sender, EventArgs e)
  2.  
    {
  3.  
    Thread fThread = new Thread(new ThreadStart(SleepT));
  4.  
    fThread.Start();
  5.  
    }
  6.  
     
  7.  
    //定義新的線程執行函數
  8.  
    private void SleepT()
  9.  
    {
  10.  
    for (int i = 0; i < 500; i++) //滾動條最大值為500
  11.  
    {
  12.  
    System.Threading.Thread.Sleep( 10);
  13.  
    SetTextMsg( 100 * i / 500, i.ToString() + "\r\n");
  14.  
    }
  15.  
    }
  16.  
     
  17.  
    //進度條值更新函數(參數必須跟聲明的代理參數一樣)
  18.  
    private void SetTextMsg(int ipos, string vinfo)
  19.  
    {
  20.  
    if (this.InvokeRequired) //InvokeRequired屬性為真時,說明一個創建它以以外的線程(即SleepT)想訪問它
  21.  
    {
  22.  
    SetPos setpos = new SetPos(SetTextMsg);
  23.  
    this.Invoke(setpos, new object[] { ipos, vinfo });//SleepT線程調用本控件Form1中的方法
  24.  
    }
  25.  
    else
  26.  
    {
  27.  
    this.label1.Text = ipos.ToString() + "/100";
  28.  
    this.progressBar1.Value = Convert.ToInt32(ipos);
  29.  
    this.textBox1.AppendText(vinfo);
  30.  
    }
  31.  
    }

以上三種情況都會產生程序假死,即在進度條運行時不能點擊。

4.第四種方法:BackgroundWorker控件實現,不會假死

BackgroundWorker可在單獨的線程上執行操作

步驟如下:

(1)主窗體設計,為主窗體添加一個BackgroundWorker控件和按鈕控件

(2)主窗體后台代碼Form1.cs

  1.  
    namespace progress_backgroundworker
  2.  
    {
  3.  
    public partial class Form1 : Form
  4.  
    {
  5.  
    public Form1()
  6.  
    {
  7.  
    InitializeComponent();
  8.  
    this.backgroundWorker1.WorkerReportsProgress = true; //設置能報告進度更新
  9.  
    this.backgroundWorker1.WorkerSupportsCancellation = true; //設置支持異步取消
  10.  
    }
  11.  
     
  12.  
    private void button1_Click(object sender, EventArgs e)
  13.  
    {
  14.  
    this.backgroundWorker1.RunWorkerAsync(); //運行backgroundWorker組件
  15.  
    ProgressForm form = new ProgressForm(this.backgroundWorker1); //顯示進度條窗體
  16.  
    form.ShowDialog( this);
  17.  
    form.Close();
  18.  
    }
  19.  
     
  20.  
    //在另一個線程上開始運行(處理進度條)
  21.  
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  22.  
    {
  23.  
    BackgroundWorker worker = sender as BackgroundWorker;
  24.  
    for (int i = 0; i < 100; i++)
  25.  
    {
  26.  
    System.Threading.Thread.Sleep( 100);
  27.  
    worker.ReportProgress(i);
  28.  
    if (worker.CancellationPending) //獲取程序是否已請求取消后台操作
  29.  
    {
  30.  
    e.Cancel = true;
  31.  
    break;
  32.  
    }
  33.  
    }
  34.  
    }
  35.  
     
  36.  
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  37.  
    {
  38.  
    if (e.Error != null)
  39.  
    {
  40.  
    MessageBox.Show(e.Error.Message);
  41.  
    }
  42.  
    else if (e.Cancelled)
  43.  
    {
  44.  
    MessageBox.Show( "取消");
  45.  
    }
  46.  
    else
  47.  
    {
  48.  
    MessageBox.Show( "完成");
  49.  
    }
  50.  
    }
  51.  
     
  52.  
     
  53.  
     
  54.  
    }
  55.  
    }

(3)子窗體設計

(4)子窗體代碼實現ProgressForm.cs

  1.  
    namespace progress_backgroundworker
  2.  
    {
  3.  
    public partial class ProgressForm : Form
  4.  
    {
  5.  
    private BackgroundWorker backgroundWorker1; //ProgressForm窗體事件(進度條窗體)
  6.  
     
  7.  
    public ProgressForm(BackgroundWorker bgWork)
  8.  
    {
  9.  
    InitializeComponent();
  10.  
    // add my code
  11.  
    this.backgroundWorker1 = bgWork;
  12.  
    //綁定進度條改變事件
  13.  
    this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
  14.  
    //綁定后台操作完成,取消,異常時的事件
  15.  
    this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
  16.  
    }
  17.  
     
  18.  
     
  19.  
    void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
  20.  
    {
  21.  
    this.progressBar1.Value = e.ProgressPercentage; //獲取異步任務的進度百分比
  22.  
    }
  23.  
     
  24.  
    void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  25.  
    {
  26.  
    //this.Close(); //執行完之后,直接關閉頁面
  27.  
    }
  28.  
     
  29.  
    //取消
  30.  
    private void btnCancel_Click(object sender, EventArgs e)
  31.  
    {
  32.  
    this.backgroundWorker1.CancelAsync(); //請求取消掛起的后台操作
  33.  
    this.btnCancel.Enabled = false;
  34.  
    this.Close();
  35.  
    }
  36.  
    }
  37.  
    }

效果如下

更多內容見參考資料

https://blog.csdn.net/ym296900664/article/details/52192289

https://www.cnblogs.com/xwzLoveCshap/p/9271592.html

圓形進度條實現

https://jingyan.baidu.com/article/eae0782742aa9d1fec54852f.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM