C# 子窗口显示进度条-BackgroundWorker 实现

进度条子窗口

Form窗口,界面如下:

禁止调整大小、禁止最大化、禁止最小化

代码

  1. /// <summary>
  2. /// 初始化进度条
  3. /// </summary>
  4. /// <param name="max"></param>
  5. public void initProgressBar(int max)
  6. {
  7. progressBar.Visible = true;
  8. // 设置进度条最小值.
  9. progressBar.Minimum = 0;
  10. // 设置进度条最大值.
  11. progressBar.Maximum = max;
  12. // 设置进度条初始值
  13. progressBar.Value = 1;
  14. // 设置每次增加的步长
  15. progressBar.Step = 1;
  16. }
  17. /// <summary>
  18. /// 设置进度条的进度
  19. /// </summary>
  20. /// <param name="i"></param>
  21. public void setProgressBarValue(int i)
  22. {
  23. progressBar.Value = i;
  24. }
  25. /// <summary>
  26. /// 设置进度条最大值
  27. /// </summary>
  28. /// <param name="i"></param>
  29. public void setMax(int i)
  30. {
  31. // 设置进度条最大值.
  32. progressBar.Maximum = i;
  33. }

主窗口

  1. private void progressBgWorker_DoWork(object sender, DoWorkEventArgs e)
  2. {
  3. progressForm.initProgressBar(10);
  4. for (int flbIndex = 0; flbIndex < 10; flbIndex++)
  5. {
  6. progressBgWorker.ReportProgress(progress+1);
  7. }
  8. }
  1. /// <summary>
  2. /// 更新UI
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void progressBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  7. {
  8. // 设置进度条
  9. this.progressForm.setProgressBarValue(e.ProgressPercentage);
  10. // 设置进度条窗口的标题
  11. progressForm.Text = "正在合并 " + e.ProgressPercentage + "/" + fileLstBx.Items.Count;
  12. }
  1. // 完成时提示,并关闭窗口
  2. private void progressBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  3. {
  4. MessageBox.Show("合并成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  5. progressForm.Close();
  6. }

关键1

进度条窗口定义成成员变量,可直接实例化

不要 在 BackgroundWorker的 DoWork() 方法中实例化,否则报错 从不是创建控件“progressBar”的线程访问它。

  1. ProgressForm progressForm = new ProgressForm();

关键2

调用 RunWorkerAsync() 后,就显示进度条窗口

不要 在 BackgroundWorker 的 DoWork() 方法中显示进度条窗口,否则报错 从不是创建控件“progressBar”的线程访问它。

  1. progressBgWorker.RunWorkerAsync();
  2. progressForm.StartPosition = FormStartPosition.CenterParent;
  3. progressForm.ShowDialog();

参考:
https://www.cnblogs.com/JackFu/p/7838729.html


原文出处:https://malaoshi.top/show_1GWjKy9xJ0R.html