【问题标题】:Label not updating in statusstrip with progressbar标签未在带有进度条的状态条中更新
【发布时间】:2014-11-11 08:13:03
【问题描述】:

我一直在 vc# express 2013 中开发 Windows 窗体应用程序。我有一个状态条控件,其中有一个标签和一个进度条。我想在标签中显示进度条的进度,但它没有随着进度条值更新。它仅在进度条完成时更新,即当值为 100 并且作业完成时。奇怪的是,进度条已更新,但标签没有……有什么想法可能发生在这里吗?顺便说一句,我在自己的代码中引发了一个进度事件,该事件被处理并相应地更新了进度...... 谢谢

我在 MGFDataHandler 类中引发了 ProgressTick 事件

if ((hundredthValue*progressMultiplier == lineCounter) || (lineCounter==totalLines))
            {
                //Raise the progress bar event!
                EventHandler handler = ProgressTick;                                        
                if (handler != null)
                {
                    handler(this, e);
                }
                progressMultiplier++;
            }

然后我在windowsform中处理如下:

void msDataHandler_ProgressTick(object sender, EventArgs e)
    {
        var progress = (int)((MGFDataHandler)sender).progressMultiplier;            
        if (progress < 100)
        {
            this.progressStatusString.Text = "Progress: " + progress + "%";                
            this.progressBar.Visible = true;
            this.progressBar.Value = progress;
        }            
        else 
        {
            this.progressStatusString.Text = "Done";
            this.filterMSDataToolStripMenuItem.Enabled = true;                
        }
    }

启动整个事情的函数在windowsform_activated事件中,MGFDataHandler对象是windowsform的一个属性。

private void GlycoMSPipelineMainFrame_Activated(object sender, EventArgs e)
    {
        switch (this.whoActivatedMe)
        {
            case WhoActivatedMe.MSFilterWizard:
                {
                    this.whoActivatedMe = WhoActivatedMe.Me;
                    foreach (String currentmgffilename in this.currentMGFFileNames)
                    {
                        mgfDataHandler.Filter_MS_Data(currentmgffilename);
                    }                        
                    this.populateTreeViews();
                    break;
                }
            default:
                {
                    break;
                }
        }
    }

引发事件的是 Filter_MS_Data。

【问题讨论】:

  • 向我们展示一些代码,以及更多信息
  • 我给你留下了答案。它有帮助吗?您需要更多信息吗?

标签: c# winforms progress-bar


【解决方案1】:

尝试使用后台工作程序(在 System.componentModel 中找到)来运行您正在执行的任务。更新标签或返回时,您需要检查是否需要调用。

类似的东西。

If (label.InvokeRequired) { 
label.Invoke(new MethodInvoker(delegate
 { 
label.Text = progress.Value;
 });
}

需要调用以防止可能产生竞争条件的交叉线程操作。

请原谅我在手机上输入的格式。

您将需要使用后台工作人员执行填充。我认为这将解决您的问题。

编辑: 后台工作人员提供了一个将在另一个线程上运行的工作事件。它还提供了一个完成的事件,以便您知道任务何时完成。

我认为这里发生的情况是您的程序正在 ui 线程上执行工作,这会阻止 ui 完全更新。

【讨论】:

    【解决方案2】:

    我确实需要更多信息才能获得完整的答案,但我很清楚这个问题的方向。

    问题是您可能在同一个线程中执行所有操作。当你有一项大工作时,你需要使用后台线程来完成工作,并让主线程(即 UI 线程)处理 UI。

    这是一个很大的话题,我只是在这里触及表面,所以首先阅读以下链接并尝试为您的工作创建一个线程并自己调用进度条的更新。如果不成功,请发布一个包含更多信息的新问题。

    您应该阅读的链接是:

    【讨论】:

    • 你刚刚接受了我的回答并详细说明了它!呸
    • 感谢您的回答。我确实在一个线程中完成了整个事情,我怀疑这可能会发生,但问题是progressbar.value 是如何能够更新GUI 而不是label.text?自从我专业地做多线程以来已经有一段时间了...但是如果你们确定这是这里的问题,请尝试一下...
    • @waqas 那么,我将不得不查看更多信息以回答 label.text 更新。但这可能是对错误文本或类似内容的一些更新
    • @Ninja_Noob 我了解您是 SO 新手,可能需要一段时间才能学会如何以正确的方式回答问题。实际上,直到此评论,我才阅读您的答案。是的,主要思想是使用多线程,但这并不意味着我“接受”了你的部分答案。那只意味着我们俩的想法相同。但不同的是如何将这种想法变成一个坚实的易于理解的答案。尽情享受吧
    • 哈哈抱歉,我只是开玩笑说偷了我的答案。我猜这在文本形式中翻译得不好。至于更完整的回答......我今天学到了,所以我改进了我的答案。谢谢你,虽然我很感激你的反馈。你帮助我成长和提高技能!我很感激:)
    【解决方案3】:

    我意识到这是一个非常古老的问题,但我在 VS2019 中发现了同样的问题。我发现可以调用标签和ProgressBar的容器的Refresh方法,而不是添加线程。

    void msDataHandler_ProgressTick(object sender, EventArgs e)
        {
            var progress = (int)((MGFDataHandler)sender).progressMultiplier;            
            if (progress < 100)
            {
                this.progressStatusString.Text = "Progress: " + progress + "%";                
                this.progressBar.Visible = true;
                this.progressBar.Value = progress;
            }            
            else 
            {
                this.progressStatusString.Text = "Done";
                this.filterMSDataToolStripMenuItem.Enabled = true;                
            }
            this.progressStatusString.Owner.Refresh();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多