使用 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#如何在 Windows 窗体应用程序中使用事件

在 C# 中对 dataGridView 列进行排序? (Windows 窗体)

如何创建一个简单的 Windows 窗体来访问 SQL Server 数据库?

如何将我的 VBA 宏转换为 C# 以在 Windows 窗体应用程序中使用?