2017-07-03 192 views
0

我使用ProgressBar来监视DataGridView的人口数据,数据从数据库中检索,并在其左侧放置一个LabelWinForms根据其属性不绘制ProgressBar

这没有什么奇特的。数据检索发生在BackgroundWorkerDoWork处理程序中,此时ProgressBar处于字幕样式,而Label显示通用的“加载...”。加载完成后,BackgroundWorkerProgressChanged处理程序将逐行添加到DataGridView的行,而ProgressBarLabel将显示进度。我使用该代码,这是下面:

*code that adds row* 
if (e.ProgressPercentage > 0) 
    pbrProgress.Value = e.ProgressPercentage - 1; 
pbrProgress.Value = e.ProgressPercentage; 
lblProgress.Text = e.ProgressPercentage + "/" + pbrProgress.Maximum; 

Label总是正确显示,并通过调试我发现ProgressBar有权ValueMaximum性能以及。然而,ProgressBar实际上并没有开始显示进展(绿色填充),直到它达到第10个结果左右。当最后一个结果被添加到DataGridView时,它也很不充分。

图片: Beginning Near the end

我试着在代码的末尾添加pbrProgress.Refresh();,并且还使用自定义ProgressBarDoubleBuffered属性设置为true,无济于事。

真的,我发现的唯一解决方案是每次调用ReportProgress后线程睡眠80毫秒。有没有比这更好的方法?

+0

[看这里](https://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired(v = vs.110).aspx) – TaW

回答

0

嘛,原来的解决方案是非常简单。

而不是

if (e.ProgressPercentage > 0) 
    pbrProgress.Value = e.ProgressPercentage - 1; 
pbrProgress.Value = e.ProgressPercentage; 

它必须

pbrProgress.Value = e.ProgressPercentage; 
if (e.ProgressPercentage > 0) 
     pbrProgress.Value = e.ProgressPercentage - 1; 

我不知道为什么它的工作的一种方式,而不是其他。也许是因为进度条值在第一次迭代中只改变一次?

无论如何,这不再是一个问题。

-1

简单:在设置ProgressBarValue属性后,添加Application.Doevents()

+0

我刚试过,但似乎没有任何明显的帮助。 –

+0

好的,尝试在你的表单上设置双缓冲区为true,并在进度条上执行无效操作。还要确保你正在检查是否需要调用。 – Trey

0

它可能是,进度条没有响应,所以它不重绘本身。

这种工作强度的东西应该在DoWork- 的事件中调用,而不是在ProgressChanged-事件中调用。 ProgressChanged -Event是您想要更改您的ProgressBar的地方。

所以你可以做某事。像这样:

private static void Worker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      int size = 100; 

      // Function to Setup your Progressbar 
      form.SetUpProgressBar(size); 

      // hard work... 
      for (int i = 0; i < size; i++) 
      { 
       Thread.Sleep(100); 

       // Fires the Worker_ProgressChanged Event with the Percentage of the current progress 
       (sender as BackgroundWorker).ReportProgress(i + 1); 
      } 
     } 

     private static void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      // Update the ProgressBar 
      form.progressBar1.Value = e.ProgressPercentage; 
     } 

     private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      MessageBox.Show("Hey I'm done!"); 
     } 

注:

之前,你可以使用worker.ReportProgress()你必须调用worker.WorkerReportsProgress = true;,否则你会遇到一个错误。

ProgressChanged中的方法调用需要调用(如果您不知道如何执行此操作,请打我)。

你应该使用的BackgroundWorker这样的:

1)DoWork您重的工作,必须从GUI线程
2)ProgressChanged报告进展到你的进度分隔
3)RunWorkerComplete表明,你现在做(关闭Windows等)

您可以喂一些BackgroundWorker的价值观,像这样的工作:worker.RunWorkerAsync(value);并通过​​(或其他)在访问此210-事件。

希望这有助于:)

- Maddin