C#:在自定义消息框中显示进度条变化

Posted

技术标签:

【中文标题】C#:在自定义消息框中显示进度条变化【英文标题】:C# : Show progress bar change in custom message box 【发布时间】:2021-09-13 06:46:50 【问题描述】:

我有 2 个表单,MainFormProgressForm

#1 MainForm.cs 有一个按钮,点击它会启动我的 backgroundWorker1。

 ProgressForm pg = new ProgressForm(); 

 private void StarBtn_Click(object sender, EventArgs e)
        
           
           pg.Show();
           
            if(!backgroundWorker1.IsBusy)
            
                backgroundWorker1.RunWorkerAsync();
            
        

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        
          //time consuming tasks...
        

#2 ProgressForm 是我添加进度条和标签的地方

namespace MainApp

    public partial class ProgressForm : Form
    
        public ProgressForm()
        
            InitializeComponent();
        

    

我需要在MainFormprogressBar1 中显示我的后台进程在ProgressForm 中的进度(如下)

 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        
           //something like..
           //this.progressBar1.Value = e.ProgressPercentage;
           //in ProgressForm...
            
        

并显示已完成的标签并关闭表单。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        
           //label.Text = "Completed"
          // Close the ProgressForm...
            
        

如何从 MainForm 的 backgroundworker 访问 ProgressFrom 中的元素并更新进度。

【问题讨论】:

作为旁注,BackgroundWorker 类是 technologically obsolete。将工作卸载到后台线程的更好方法是 Task.Run 方法,结合 async/await。 【参考方案1】:

您的后台工作人员事件在 MainForm 中?如果是这样,那么将公共属性添加到您的 ProgressForm 并根据提供的值设置标签和/或进度条。

进度表

public int Progress 
set 
    progressBar1.Value = value;
  

public string LabelText
set 
   label.Text = value;
  

主窗体

pg.Progress = e.ProgressPercentage;

【讨论】:

试过了,但是进度条没有更新。甚至尝试过 this.Invoke((MethodInvoker)delegate inside set 命令。仍然没有更新 我在不同的项目中使用相同的方法。到目前为止,它一直有效。你在哪里设置这两个属性?在哪种情况下? 我在 ProgressForm 和 MainForm 上使用了 'set' 属性,我调用了 pg.Progress = e.ProgressPercentage;在 backgroundWorker1_ProgressChanged 事件中。需要对进度条进行任何初始化吗? 你的 ProgressChanged 事件被调用了吗?你设置了 backgroundWorker1.WorkerReportsProgress = true; 您必须自己调用 ProgressChanged。 BackgroundWorker 不知道您已经完成了多少工作。

以上是关于C#:在自定义消息框中显示进度条变化的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义列表的进度条

C# - 在自定义控制台扩展方法中使用常规 Console.WriteLine 格式?

尝试在自定义侧边栏上显示用户名,它给了我下面的错误消息

Inno Setup - 在自定义页面上复制带有进度条的文件

在自定义 Django 表单中验证和显示错误

如何在自定义对话框上显示进度对话框?