使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView
Posted
技术标签:
【中文标题】使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView【英文标题】:Populate dataGridView with a large set of results from SQL query in C# Windows Forms 【发布时间】:2011-05-27 04:15:41 【问题描述】:我创建了一个Windows Forms,上面有一个dataGridView。我还有一个长时间运行的 SQL 查询,我在 BackgroundWorker 线程中运行以填充静态数据表。
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;
(结果是我的数据集)这是需要很长时间的部分。
有什么方法可以预先绑定dataGridView,或者在后台绑定它?
【问题讨论】:
【参考方案1】:如果您使用数据网格的虚拟模式,则仅加载显示的行。否则,将加载所有行。
http://msdn.microsoft.com/en-us/library/2b177d6d.aspx
【讨论】:
【参考方案2】:它将使用反射将值从数据源中提取出来。一种更快的方法可能是自己构建和添加行。您也许可以在后台线程中构建行列表,然后在主 UI 线程上将它们添加为范围 - 不确定。
显然这样做会失去数据绑定的好处,但如果你想加载大量数据,这可能是唯一的选择。事实证明你可以使用 VirtualMode,你自己实现部分,但保留数据绑定的好处。
【讨论】:
【参考方案3】:按照 Run CMD 的说明进入虚拟模式。这里有几篇文章可以帮助您入门。
Paging Data with DataGridView in VirtualModeWalkthrough: Implementing Virtual Mode in the Windows Forms DataGridView Controlhttp://devintelligence.com/2007/02/displaying-large-amount-of-data-in-datagridview/
【讨论】:
【参考方案4】:由于 GridView 是一个可视组件,我认为规则适用,您只能从创建这些控件的前台线程中调用方法和属性。
也许您可以逐步填充网格,添加每个例如每次迭代100条记录,控制响应更流畅。
Microsoft SQL Server Management Studio 似乎也使用了 GridView,可以很好地处理大行。
【讨论】:
以上是关于使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView的主要内容,如果未能解决你的问题,请参考以下文章
使用 Web 服务为 Windows 窗体客户端运行 SQL 查询
如何在 Windows 窗体中运行 MS Access 2013 中保存的查询。 C#
在 C# 中对 dataGridView 列进行排序? (Windows 窗体)