我正在用 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];
}
解释:
VirtualMode:通过启用虚拟模式(
VirtualMode = true
),DataGridView
仅加载显示网格可见部分所需的数据,从而大大提高大型数据集的性能。
处理
CellValueNeeded
:使用 CellValueNeeded
事件允许您仅获取可见单元格所需的数据,从而减少内存使用并增强响应能力。
此方法对于提高具有大型数据集的 Windows 窗体应用程序的性能特别有用。
我经常使用DataGridView,即使我有超过 10,000 条记录要显示,我也不需要等待超过 8-9 秒。我从未使用过 VirtualMode 或 CellValueNeeded 事件,但我一定会尝试它们!
无论如何,每次我只是使用 datagridview1.DataSource = DataTable 并且,如果我学到了什么,那就是当你有大量数据时,你真的不应该使用 dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill 或 dataGridView1.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);
当我了解到这一点时,它对我来说真的很有用,我希望它也对你有用!