【问题标题】:Updating DataGrid in BackgroundWorker Thread在 BackgroundWorker 线程中更新 DataGrid
【发布时间】:2010-01-07 11:05:17
【问题描述】:

我有一个返回数百行的 SQL 查询,我需要将它们添加到 WinForms DataGrid,在添加行时仍允许用户查看/滚动 DataGrid。

目前,我正在使用 BackgroundWorker 线程执行 SQL 语句并循环遍历 DataReader 中的行,然后使用 Control.BeginInvoke 将每个新行传递回 UI 线程,然后将其添加到绑定到的 DataTable数据网格。这并没有真正达到预期的效果(更新 DataGrid 需要一点时间,然后在更新一次后 UI 变得无响应)。

有没有办法做我想做的事,如果有怎么办?

编辑:我在工作线程中添加了一个 thread.sleep,因为它循环通过数据读取器,这会阻止 UI 在第一次更新后变得无响应,但它仍然没有我希望的响应(滚动有点跳动,因为在 ui 线程中添加一行似乎会窃取焦点)。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您是否查看过 DataGridView 控件的虚拟模式?它可以提供某种方式来仅迭代您需要查看的行(即仅在用户滚动时获取数据)。

    见:http://msdn.microsoft.com/en-us/library/ms171622.aspx

    PS:DataGrid 是旧的,试试 DataGridView :)

    【讨论】:

    • 我现在来看看。感谢您的快速回复:)
    【解决方案2】:

    目前我正在使用 BackgroundWorker 线程来执行 SQL 语句并循环遍历 DataReader 中的行,然后再使用 Control.BeginInvoke 将每个新行传递回 UI 线程,其中 它被添加到绑定到 DataGrid 的 DataTable 中。

    您似乎正在使用 Dispatcher 来更新 UI。这不是一个好主意。在多线程环境中使用数据网格很棘手。我在这里发布了一个模板。它涵盖了在多线程设置中使用数据网格的可能方法。

    http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2013-11-12
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多