【问题标题】:Progress Bar not progressing according to max size进度条未按照最大尺寸进行
【发布时间】:2017-07-12 05:09:40
【问题描述】:

我正在尝试编写一个简单的程序 (c#),它读取一组 zip 文件以搜索某些特定文件。

我使用 winform 和后台工作人员实现了这一点,但我在理解如何配置进度条以根据我正在解析的文件数量动态进行时遇到了一些麻烦。

例如,在目录 A 中,我有 400 个 zip 文件,所以我希望进度条的“大小”为 400 个单位,因此打开的每个文件都会将进度条增加 1。在目录 B 中,我只有 4 个 zip 文件所以我在进度条中需要 4 个块

我尝试执行以下代码只是为了测试进度条 我将最大值设置为 20(表示 20 个 zip 文件),并在循环中以 1 递增进度条

        private void button_SearchZip_Click(object sender, EventArgs e)
    {
        if(!backgroundWorker_SearchZip.IsBusy)
        {
            SearchZipArgs args = new SearchZipArgs
            {
                sourceDirectory = this.textBox_SrcDir.Text
            };

            backgroundWorker_SearchZip.RunWorkerAsync(args);
            this.button_SearchZip.Enabled = false;
        }
        else
        {
            MessageBox.Show(@"Search already in process. please try again later");
        }
    }

    private void backgroundWorker_SearchZip_DoWork(object sender, DoWorkEventArgs e)
    {

            this.progressBar_SearchZip.Style = ProgressBarStyle.Blocks;
            //this.progressBar_SearchZip.Step = 1;
            this.progressBar_SearchZip.Minimum = 0;
            this.progressBar_SearchZip.Maximum = 20;
            for(int i = 0; i < 20; i++)
            {
                backgroundWorker_SearchZip.ReportProgress(i);
                Thread.Sleep(300);
            } 
    }

    public MainForm()
    {
        InitializeComponent();
        this.backgroundWorker_SearchZip.WorkerReportsProgress = true;
        this.backgroundWorker_SearchZip.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker_SearchZip_DoWork);
        this.backgroundWorker_SearchZip.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker_SearchZip_ProgressChanged);
        this.backgroundWorker_SearchZip.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker_SearchZip_RunWorkerCompleted);
    }

    private void backgroundWorker_SearchZip_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar_SearchZip.Value = e.ProgressPercentage;
    }

但这是我在进度条中得到的:

由于某种原因,如果取消注释:

this.progressBar_SearchZip.Step = 1;

进度条根本不工作

任何帮助都会很好:)

编辑: 发现问题了!我试图从后台线程更改进度条,但出现错误“跨线程操作无效:控制'progressBar Search Zip'从创建它的线程以外的线程访问” 修复此错误后(在此线程的帮助下:Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on)问题解决了

【问题讨论】:

  • backgroundWorker.ProgressChanged 事件在哪里?
  • @A3006 忘记添加了。我已经编辑了问题

标签: c# winforms progress-bar


【解决方案1】:

Step 属性用于调用PerformStep 方法。

要设置进度条的当前位置,您可以像这样使用Increment 函数:

progressBar.Increment(1);

或者像这样设置它的值:

progressBar.Value = yourValue;

【讨论】:

  • @S. Dav - 据我所知 - 我们是否需要在 ProgressChanged 中编写这些行?我认为这是从 ReportProgress 调用的?
  • 您可能是对的,但我们在问题中看不到 ReportProgress 函数。
【解决方案2】:

你需要添加

backgroundWorker_SearchZip.ProgressChanged += this.OnProgressChanged;

进入你的初始化函数(例如Form_Load)

然后添加

private void OnProgressChanged(object sender, ProgressChangedEventArgs e) {
  this.progressBar_SearchZip.Increment(1);
}

【讨论】:

  • 按照您的建议在Button Click 事件中订阅ProgressChanged 事件真的是个好主意吗?这最好在Form_Load 或任何其他初始化方法上完成
  • 好点,我误读了这个问题,并认为我看到它在点击事件中被初始化。我会进行编辑
  • @S.Dav 忘记添加 ProgressChanged 代码。我已经编辑了问题
  • @BobVale this.backgroundWorker_SearchZip.Increment(1) 不符合要求。你的意思是:this.progressBar_SearchZip.Increment(1) 吗?
【解决方案3】:

这段代码对我有用:

this.progress_bar.Properties.Minimum = 0; 
this.progress_bar.Properties.Maximum = datatable.Rows.Count;

foreach (DataRow row in datatable.Rows)     {

   // operation that you need to do     

   this.progress_bar.Increment(1);
   this.progress_bar.Update();
}

祝你好运

【讨论】:

  • 所以如果你得到 10 行或 1000 行 - 在这两种情况下进度条都会填充到最后?
  • 是的,foreach 中的每次迭代都会将进度条的值增加 1 并更新进度条的状态....该示例代码在从数据表并对其执行一系列检查。
【解决方案4】:

发现问题了!

我试图从后台线程更改进度条,我收到错误“跨线程操作无效:控制'progressBar Search Zip'从创建它的线程以外的线程访问”

修复此错误后(在此线程的帮助下:Cross-thread operation not valid: Control 'textBox1' accessed from a thread other than the thread it was created on)问题解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多