向DataGridView添加行太慢了

时间:2016-04-21 13:12:26

标签: c# winforms datagridview

我有DataGridView,我就这样填写:

private void FillDataGridView(string stringTable)
{
    var lines = stringTable.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

    var columns = lines.First().Split('\t');
    foreach (var columnName in columns)
        this.dataGridView.Columns.Add(columnName, columnName);

    foreach (var line in lines.Skip(1))
    {
        var cells = line.Split('\t');
        // This operation is too slow when applied to a huge amount of rows:
        this.dataGridView.Rows.Add(cells);                
    }            
}

我的问题是Rows.Add(cells)太慢了(我有大量的数据)。

这是stringTable

内容的示例
TIME    Temperature
30.03.1992 10:00:00 7.500
30.03.1992 11:00:00 9.300
30.03.1992 12:00:00 10.000
30.03.1992 13:00:00 10.400
30.03.1992 14:00:00 11.400
30.03.1992 15:00:00 11.800
...

我想使用BindingList并将其设置为DataSource,这样会更快。问题是我不知道先验列的数量(在这个例子中只是“时间,温度”,但它可能是“时间,温度,降雨,......,其他”)。

2 个答案:

答案 0 :(得分:3)

不要在循环中一次向行添加一行。首先在循环中创建所有行,然后通过一次调用AddRange将它们全部添加到网格中。

或者,填充DataTable或其他合适的列表,然后将其绑定到网格。

如果您有太多的数据仍然太慢,那么您可能需要查看虚拟化网格。

答案 1 :(得分:0)

如果您不想更改代码,请尝试:

  • DataGridView
  • 期间暂停FillDataGridView绘图
  • 在流程结束时恢复DataGridView绘图

要暂停控制绘图,您可以使用以下代码:

SendMessage(ctrlControl.Handle, WM_SETREDRAW, 0, 0)

要恢复控制绘图,您可以使用以下代码:

SendMessage(ctrlControl.Handle, WM_SETREDRAW, 1, 0)
ctrlControl.Refresh()

请记住使用Try/Catch/Finally块以防止出现问题并暂停DataGridView绘图时出现问题。

Try
    Application.DoEvents()

    Me.Cursor = Cursors.WaitCursor

    SuspendControlDrawing(yourDataGridView)

    FillDataGridView(stringTable)

Catch ex As Exception
    MsgBox(ex.Message)

Finally

    Try
        ResumeControlDrawing(yourDataGridView)
    Catch ex As Exception
    End Try

    Me.Cursor = Cursors.Default

End Try