我正在从数据表填充datagridview。
在填充列和行时,我也同时对其进行格式化,这会导致datagridview加载速度非常慢,是否有解决此问题的方法?
答案 0 :(得分:11)
除了处理AutoSizeColumnsMode
之外,请确保各列的AutoSizeMode
属性也设置为除所有单元格以外的其他属性。
我还发现有必要使用
SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before
// updates to datagridview here...
SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after
答案 1 :(得分:8)
这将是datagridview fast as java jtable:)
public static class ExtensionMethods
{
public static void DoubleBuffered(this DataGridView dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
}
ExtensionMethods.DoubleBuffered(dataGridView1, true);
答案 2 :(得分:6)
我花了大约2-4分钟加载1-2k行。我更改了自动调整大小属性,现在它已经下降到几秒钟,大概是10-20。我在行创建循环之前运行此命令以确保它获得所有列。
foreach (DataGridViewColumn c in thisGrid.Columns)
{
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
}
答案 3 :(得分:4)
您可以检查DataGridView的属性 - AutoSizeColumnsMode 我发现如果我将模式从AllCells更改为DisplayedCells,性能会有所不同。 我希望这会对你有所帮助。
答案 4 :(得分:3)
当您使用数据网格视图显示来自dataabse的数据时,您应该始终考虑使用某种策略来限制结果集,并仅在用户真正看到它们时显示记录。这称为有时虚拟模式或数据分页。我得到了一个example of this strategy for wpf,但是winforms也有一些东西。也看看这个问题:Winform DataGridview incredibly slow compared to MS Access Grid我认为也与你的问题有关。
答案 5 :(得分:1)
一个愚蠢的老家伙的规则: - 避免使用DataTable,众所周知,这是无效的 - 避免使用行的预分配[“Grid”.Rowcount +“Grid”.AddRange()+ ..](比“Grid”ADD()慢〜5倍) - 考虑将DataGridView绑定到“您的屏幕”:即。用一些数据屏幕加载它。 - 我应用了这些简单的事实,我可以在15秒内“加载”一个420 000行的“愚蠢文件”和159列。 (~200 MB)。
答案 6 :(得分:0)
我的表现相当不错DataGridView
。添加几百行大约需要200ms。这是我的所作所为:
virtual = true
- 使用虚拟化数据网格视图似乎可以让整个过程更快。请记住正确实施logViewGrid_CellValueNeeded
。
另一件事是在向绑定列表添加数据时暂时禁用布局事件。尝试做:
logViewGrid.SuspendLayout();
// add data, perform some operations on grid view
logViewGrid.ResumeLayout(false);
我也遇到了慢行着色的问题;我这样做的方法是分别设置每个单元格的样式,如下所示:
gridViewInstance.Rows[currentRow].Cells[cellIndex].Style.BackColor = val;
相反,我去了:
gridViewInstance.Rows[currentRow].DefaultCellStyle.BackColor = val;
对于30列,这部分代码显着提高了速度。
答案 7 :(得分:0)
我在一个程序中做了一些测试,我加载了5000行,每列6列,每个单元格都加载了行号,只是为了得到一些数据。然后我用秒表测试每种方法。我加载了dataviewgrid,禁用它并加载它然后启用它,隐藏它,加载它,并显示它,以及suspendlayout和resumelayout。我发现通过隐藏它并加载它然后显示它在我的测试中要快得多。花了: 只需加载.91秒 .91秒暂停,负载,resumeLayout .25秒禁用,加载和重新启用网格 .19秒隐藏,加载和显示网格。
我同意你应该避免加载你不需要的东西,但认为这个测试会有所帮助。
答案 8 :(得分:0)
我遇到了同样的问题,就我而言,我还必须解决
DataGridView.RowHeadersWidthSizeMode = DisableResizing
答案 9 :(得分:0)
这是我发现有效的方法。我正在构建一个具有自定义单元格颜色的52x15网格,生成和显示上面的所有建议所需的时间在10到20秒之间。
此更改现在使其在大约1秒钟内显示,并带有上面的双缓冲。
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
然后完成数据生成
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
答案 10 :(得分:0)
对我来说,问题出在 ColumnHeadersHeightSizeMode 属性上,所以我建议使用这个代码片段,其中包含了其他受访者的一些建议。如果您的网格没有以某种方式自动调整大小,则这样做的优点是不会盲目地恢复到自动调整大小。:
private static void FastLoadDataGrid<T>(DataGridView dgv, IEnumerable<T> objList)
{
// Cache old values
DataGridViewAutoSizeColumnsMode oldAutoSizeCols = dgv.AutoSizeColumnsMode;
DataGridViewAutoSizeRowsMode oldAutoSizeRows = dgv.AutoSizeRowsMode;
DataGridViewRowHeadersWidthSizeMode oldRowHeader = dgv.RowHeadersWidthSizeMode;
DataGridViewColumnHeadersHeightSizeMode oldCol = dgv.ColumnHeadersHeightSizeMode;
dgv.SuspendLayout(); // off for performance
// switch off stuff for performance
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// flush and load data source
dgv.DataSource = null;
dgv.DataSource = new List<T>(objList); //wrap in sortable bindinglist to allow user to sort via column header click
// revert back to old values
dgv.AutoSizeColumnsMode = oldAutoSizeCols;
dgv.AutoSizeRowsMode = oldAutoSizeRows;
dgv.RowHeadersWidthSizeMode = oldRowHeader;
dgv.ColumnHeadersHeightSizeMode = oldCol;
dgv.ResumeLayout(false); // turn back on
}
对该过程的典型调用是:
FastLoadDataGrid(MyDataGridView, MyListOfCustomers);
通过使用我的 FastLoadDataGrid,导入 10000 行 3 列并且每次成功显示在数据网格视图中的测试从 8 秒缩短到 3 秒。
微软的其他建议是: DataGridView optimizations
一种完全不同的方法,也可以这样做或代替使用虚拟化。打开 VirtualMode = true。但这可能需要重构数据绑定事件。看: DataGridView Virtualization