2010-01-07 56 views
0

我有一个返回数百行的SQL查询,我需要把它们添加到一个WinForms的DataGrid的方式,将仍然允许用户查看/滚动DataGrid中的行是添加。在BackgroundWorker的主题更新的DataGrid

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

有没有办法做到我想要的,如果是的话如何?

编辑:我已经添加了一个thread.sleep到工作线程,因为它通过datareader循环,这阻止了UI在第一次更新后无响应,但它仍然没有我希望的那样响应(因为在UI线程中添加一行似乎窃取了焦点,所以滚动有点不安)。

回答

1

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

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

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

+0

我现在来看看。感谢您的快速回复:) – 2010-01-07 11:39:03

+0

这很好,谢谢! – 2010-01-07 18:29:18

0

目前我使用一个BackgroundWorker线穿过排在一个DataReader执行SQL语句 和循环,之前使用 Control.BeginInvoke将每个新行传递回UI线程,其中 它被添加到绑定到DataGrid的DataTable。

看来您正在使用分派器来更新UI。这不是一个好主意。在多线程环境中使用datagrid是非常棘手的。我在这里发布了一个模板。它涵盖了在多线程设置中使用datagrid的可能方法。

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