2010-12-17 83 views
4

我使用dataGridView创建了一个Windows Forms。我还有一个长时间运行的SQL查询,我正在运行一个BackgroundWorker线程来填充静态数据表。用C#Windows窗体中的SQL查询结果填充dataGridView

private void RunQuery_DoWork(object sender, DoWorkEventArgs e) 
{ 
    OdbcDataAdapter adapter = new OdbcDataAdapter(longRunningSQLQuery, datasourcename); 
    adapter.Fill(results); 
} 

private void RunQuery_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    dataGridView1.DataSource = results; 
} 

这工作得很好。当我去运行查询时,由于结果在后台生成,UI保持响应...但是,当需要在我的dataGridView中显示结果时,如果窗口是一大组数据,窗口会冻结。如果我让它坐下一段时间,最终它会结束。在我的RunWorkerCompleted回调函数中,我打电话 dataGridView1.DataSource = results;(结果是我的DataSet),这是需要很长时间的部分。

有没有什么办法可以预先绑定dataGridView,或绑定它在backgroundworker?

回答

1

它将使用反射拉值出的数据源的。更快的方法可能是自己构建和添加行。您可能能够在后台线程中构建行列表,然后在主UI线程上添加它们作为范围 - 不确定。

显然这样做会损失数据绑定的好处,但是如果您想要加载大量数据, 这可能是唯一选项 。事实证明,你可以使用VirtualMode,你自己实现零件,但保持数据绑定的好处。

0

由于GridView是一个可视化组件,我认为这个规则适用,只能在创建这些控件的前台线程中调用方法和属性。

也许你可以逐步填充网格,添加每个网格。每次迭代100条记录,使控制响应更平稳。

Microsoft SQL Server Management Studio似乎也使用了一个GridView,处理大行很好。