1

datagridview 加载非常缓慢。我该如何优化它?

datagridview 有 4-5 千行。
我必须在几个参数上动态生成一个datagridview。(来自数据库的数据,列数)

我必须从数据库中的表(id,name,contact)垂直生成这样的datagridview ..

第 1 列

身份证
姓名
联系人

现在可以在column1 旁边有任意数量的空列。

目前我正在遵循这种方法。

  1. 首先添加所有空列。
  2. 然后在每个 for 循环迭代中添加三行,每个 (id,name,contact) 一行。
  3. 我正在从数据库中获取数据并将其作为 a 传递List <string[]>GenerateRows函数。

     private void GenerateColumns(int colLen)
        {
            dataGridViewGenerate.Rows.Clear();
            dataGridViewGenerate.Columns.Clear();
    
            DataGridViewColumn col0 = new DataGridViewTextBoxColumn();
            col0.HeaderText = "Employee No. & Name";
            dataGridViewGenerate.Columns.Add(col0);
    
            for (int i = 0; i < colLen; i++)
            {
                DataGridViewColumn col = new DataGridViewTextBoxColumn
                    {
                        HeaderText =
                            (_sTime.AddDays(i)).Day.ToString(CultureInfo.InvariantCulture) + " " +
                            (_sTime.AddDays(i)).ToString("ddd")
                    };
    
                dataGridViewGenerate.Columns.Add(col);
        }
    
    
    private void GenerateRows(List<string[]> empList)
        {
            int len = empList.Count;
            for (int a = 0; a < len; a++)
            {
                string[] arr = empList[a];
                //row 1
                var row1 = new DataGridViewRow();
                row1.Cells.Add(new DataGridViewTextBoxCell
                    {
                        Value = arr[0]
                    });
                dataGridViewGenerate.Rows.Add(row1);
    
                //row 2
                var row2 = new DataGridViewRow();
                row2.Cells.Add(new DataGridViewTextBoxCell
                    {
                        Value = arr[1]
                    });
                dataGridViewGenerate.Rows.Add(row2);
    
                //row3
    
                var row3 = new DataGridViewRow();
                row3.Cells.Add(new DataGridViewTextBoxCell
                    {
                        Value = arr[2]
                    });
                dataGridViewGenerate.Rows.Add(row3);
            }
        }
    

我正在考虑在 sql 中创建一个程序,该程序将创建一个表并用数据填充它。然后只需将数据源分配给datagridview。

4

3 回答 3

2

我所做的不是将行一一添加到DataGridView. DataTable我刚刚从我的数据中创建了一个并将其分配DataSourceDataGridView.

加载的DataGridView性能显着提高。

于 2013-07-12T02:49:01.707 回答
1

问题是每当您向其中添加一行时,Datagridview 都会重新绘制,如果您不介意使用 P/Invoke,您可以尝试此解决方案 //暂停绘制

SendMessage(Datagridview.Handle, WM_SETREDRAW, false, 0);

//您在此处添加行的循环

然后调用下面的方法来恢复绘画

SendMessage(Datagridview.Handle, WM_SETREDRAW, true, 0);

并且 P/Invoke 声明应该是这样的

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 0x000B;
于 2013-07-09T18:03:43.913 回答
0

调用 Rows.Add() 很昂贵。这是一个快速而肮脏的改变来解决这个问题。

private void GenerateRows(List<string[]> empList)
{
    List<DataGridViewRow> rows = new List<DataGridViewRow>();
    int len = empList.Count;
    for (int a = 0; a < len; a++)
    {
        string[] arr = empList[a];
        //row 1
        var row1 = new DataGridViewRow();
        row1.Cells.Add(new DataGridViewTextBoxCell{Value = arr[0]});
        /* CHANGED to add to List */
        rows.Add(row1);

        //row 2
        var row2 = new DataGridViewRow();
        row2.Cells.Add(new DataGridViewTextBoxCell{Value = arr[1]});
        /* CHANGED to add to List */
        rows.Add(row2);

        //row3

        var row3 = new DataGridViewRow();
        row3.Cells.Add(new DataGridViewTextBoxCell{Value = arr[2]});
        /* CHANGED to add to List */
        rows.Add(row3);
    }

    /* ADDED all rows at once for performance */
    dataGridViewGenerate.Rows.AddRange(rows.ToArray());
}
于 2013-07-09T17:59:28.743 回答