【问题标题】:How do i display a progress bar while loading a datatable to DataGridview?将数据表加载到 DataGridview 时如何显示进度条?
【发布时间】:2014-02-27 05:05:42
【问题描述】:

我有一个名为 GetAllRecords() 的方法,它将返回一个包含 200K 记录的数据表。当我检查时,将数据加载到数据网格大约需要 5 秒钟,然后窗口冻结。

DataTable dt = Records.GetAllRecords();

我知道我必须使用后台工作控件,这是三个事件,但我不知道如何正确使用它们。例如,进度条必须显示真实的进度,而不是虚假的。我可以使用线程类的 sleep() 减慢进度条,但这将是一个假的进度条。

  1. 这里的任何人都可以给我一步一步的说明如何在我的 Windows 窗体上创建一个真正的进度条吗?

  2. .NET 2.0 之前没有后台工作控制,那时候程序员是怎么写真正的进度条的?

谢谢

【问题讨论】:

标签: c# winforms


【解决方案1】:

如果您搜索该网站以及 Google,您会发现有多种尝试这样做:

SO Link

MSDN Link

这些解决方案基本上会在您将每一行添加到网格后更新进度条,但如果您尝试显示实际数据库调用的进度,我认为您不能非常准确地做到这一点。

我认为您将遇到的主要问题是您不会有事件挂钩来让您确切知道绑定的耗时部分在哪里发挥作用。我假设 将数据绑定到网格后需要 5 秒,并且您没有计算实际拉下记录的加载时间。

Pre-BackgroundWorker

BackgroundWorker 类基本上只是方便您自己处理线程并为您调用返回 UI 线程的任何进度。您必须生成自己的线程,并在完成将数据应用到 UI 线程的工作后在您的控件上调用 BeginInvoke,因为您无法在除主线程之外的任何线程上更改 UI。

【讨论】:

    【解决方案2】:

    有关如何实现 BackgroundWorker 和 ProgressBar 的基础知识,您可以参考 MSDN 页面中为 ProgressBarBackgroundWorker 提供的示例

    至于实际使 ProgressBar 的已完成百分比属性有意义,关键在于找到一个有意义的值用作 BackgroundWorker.ReportProgress(int) 的参数。您可能已经注意到,在大多数教程和示例中,人们通常只会在 1 -> 100 的 for 循环中执行 Thread.Sleep(100),然后将迭代变量作为参数发送给 ReportProgress。

    对您来说最简单的解决方案可能是将 ProgressBarStyle 属性设置为 Marquee。这样一来,您的用户就可以放心,您的应用程序没有冻结并且正在取得进展,尽管他们不知道操作完成需要多长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2013-08-25
      • 2018-02-12
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多