【问题标题】:Populate dataGridView with a large set of results from SQL query in C# Windows Forms使用 C# Windows 窗体中 SQL 查询的大量结果填充 dataGridView
【发布时间】: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,或者在后台绑定它?

【问题讨论】:

    标签: c# sql datagridview backgroundworker


    【解决方案1】:

    如果您使用数据网格的虚拟模式,则仅加载显示的行。否则,将加载所有行。

    http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

    【讨论】:

      【解决方案2】:

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

      显然这样做会失去数据绑定的好处,但如果你想加载大量数据,这可能是唯一的选择。事实证明你可以使用 VirtualMode,你自己实现部分,但保留数据绑定的好处。

      【讨论】:

        【解决方案3】:
        【解决方案4】:

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

        也许您可以逐步填充网格,添加每个例如每次迭代100条记录,控制响应更流畅。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-04
          • 1970-01-01
          • 2012-07-26
          • 2014-05-11
          • 1970-01-01
          相关资源
          最近更新 更多