在BackgroundWorker线程中更新DataGrid

时间:2010-01-07 11:05:17

标签: c# winforms

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

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

有没有办法做我想做的事情,如果是这样的话?

编辑:我在工作线程中添加了一个thread.sleep,因为它循环通过datareader,这阻止了UI在第一次更新后没有响应,但它仍然没有像我希望的那样响应(滚动有点跳跃,因为在ui线程中添加一行似乎偷走了焦点。)

2 个答案:

答案 0 :(得分:1)

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

请参阅:http://msdn.microsoft.com/en-us/library/ms171622.aspx

PS:DataGrid已经过时了,请尝试使用DataGridView:)

答案 1 :(得分:0)

  

目前我正在使用BackgroundWorker线程来执行SQL   在使用之前声明并循环遍历DataReader中的行   Control.BeginInvoke将每个新行传递回UI线程所在的位置   它被添加到DataTable中,它绑定到DataGrid。

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

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