c#填充datagridview非常慢

时间:2011-11-05 08:46:33

标签: c# datagridview

我正在从数据表填充datagridview。

在填充列和行时,我也同时对其进行格式化,这会导致datagridview加载速度非常慢,是否有解决此问题的方法?

11 个答案:

答案 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