DataGridView загружается очень медленно. Как оптимизировать добавление строк в DataGridView?

Вопрос: Datagridview загружается очень медленно. Как я могу его оптимизировать? У datagridview есть 4-5 тысяч строк. Я должен динамически генерировать datagridview по нескольким параметрам (данные из базы данных, количество столбцов) Мне нужно создать datagridview, как это вертикально, из таблицы (id, name, contact) в базе данных. Column1 Я бы имя контакт Теперь рядом с столбцом1 может

Вопрос:

Datagridview загружается очень медленно. Как я могу его оптимизировать?

У datagridview есть 4-5 тысяч строк.
Я должен динамически генерировать datagridview по нескольким параметрам (данные из базы данных, количество столбцов)

Мне нужно создать datagridview, как это вертикально, из таблицы (id, name, contact) в базе данных.

Column1

Я бы
имя
контакт

Теперь рядом с столбцом1 может быть любое количество пустых столбцов .

В настоящее время я придерживаюсь такого подхода.

  1. Сначала добавим все пустые столбцы.
  2. Затем добавляем по три строки в каждой итерации цикла для каждой строки (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. Я только что создал DataTable из своих данных и назначил его как DataSource для DataGridView.

Производительность загрузки DataGridView значительно улучшилась.

Ответ №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; Ответ №2

Вызов 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()); }

Оцените статью
Добавить комментарий