我有一个返回数百行的SQL查询,我需要将它们添加到WinForms DataGrid中,这样仍然允许用户在添加行时查看/滚动DataGrid。
目前我正在使用BackgroundWorker线程执行SQL语句并循环遍历DataReader中的行,然后使用Control.BeginInvoke将每个新行传递回UI线程,并将其添加到绑定到的DataTable中DataGrid。这实际上没有达到预期的效果(更新DataGrid需要一点时间,然后在更新后,UI变得无法响应)。
有没有办法做我想做的事情,如果是这样的话?
编辑:我在工作线程中添加了一个thread.sleep,因为它循环通过datareader,这阻止了UI在第一次更新后没有响应,但它仍然没有像我希望的那样响应(滚动有点跳跃,因为在ui线程中添加一行似乎偷走了焦点。)
答案 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