DataGridView加载速度非常慢.如何优化在DataGridView中添加行

本文关键字:DataGridView 优化 添加行 何优化 速度 加载 非常 | 更新日期: 2023-09-27 18:21:37

数据网格视图加载速度非常慢。如何优化它

数据网格视图有4-5000行
我必须根据几个参数动态生成一个数据网格视图。(数据库数据,列数)

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

第1列

id
名称
联系

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

目前我正在采用这种方法。

  1. 首先添加所有空列
  2. 然后在每个for循环迭代中添加三行,每行一行(id、name、contact)
  3. 我从数据库中获取数据,并将其作为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

DataGridView加载速度非常慢.如何优化在DataGridView中添加行

我所做的不是一行一行地添加到DataGridView中。我刚刚从数据中创建了一个DataTable,并将其作为DataSource分配给DataGridView

CCD_ 7的加载性能显著提高。

问题是,每当您向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;

调用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());
}