如何优化在 C# (.NET Framework) 中的 DataGridView 中加载大型数据集?

问题描述 投票:0回答:1

我正在用 C# 开发一个 Windows 窗体应用程序,它将大型数据集加载到

DataGridView
中。当我加载超过 10,000 条记录时,UI 变得非常缓慢且无响应。如何提高性能并使
DataGridView
更具响应性?

我尝试过使用

DataTable
作为数据源,但性能仍然很差。是否有更有效的方法来处理 .NET Framework 中的大型数据集?

// Use VirtualMode to improve DataGridView performance with large datasets.
public void SetupDataGridView()
{
    dataGridView1.VirtualMode = true;
    dataGridView1.CellValueNeeded += dataGridView1_CellValueNeeded;
    dataGridView1.RowCount = numberOfRecords; // Set the expected number of records
}

// This event retrieves data only when necessary.
private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    e.Value = RetrieveDataFromDatabase(e.RowIndex, e.ColumnIndex);
}

// Simulated data retrieval method; you can replace this with actual database access.
private object RetrieveDataFromDatabase(int rowIndex, int columnIndex)
{
    // Fetch the necessary data for the specific cell.
    return yourDatabase[rowIndex, columnIndex]; 
}

解释

  1. VirtualMode:通过启用虚拟模式(

    VirtualMode = true
    ),
    DataGridView
    仅加载显示网格可见部分所需的数据,从而大大提高大型数据集的性能。

  2. 处理

    CellValueNeeded
    :使用
    CellValueNeeded
    事件允许您仅获取可见单元格所需的数据,从而减少内存使用并增强响应能力。

此方法对于提高具有大型数据集的 Windows 窗体应用程序的性能特别有用。

c# performance winforms datagridview virtualmode
1个回答
0
投票

我经常使用DataGridView,即使我有超过 10,000 条记录要显示,我也不需要等待超过 8-9 秒。我从未使用过 VirtualModeCellValueNeeded 事件,但我一定会尝试它们!

无论如何,每次我只是使用 datagridview1.DataSource = DataTable 并且,如果我学到了什么,那就是当你有大量数据时,你真的不应该使用 dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.FilldataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,但是(如果需要的话)手动设置列宽:dataGridView1.Columns[0].Width = 150;。 另外,您应该考虑将 DoubleBuffered 设置为 true,以便平滑地滚动数据:

    Type dataGridView1Type = dataGridView1.GetType();
    PropertyInfo PropInfo = dataGridView1Type.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
    PropInfo.SetValue(dataGridView1, true, null);

当我了解到这一点时,它对我来说真的很有用,我希望它也对你有用!

© www.soinside.com 2019 - 2024. All rights reserved.