Вопрос:
Datagridview загружается очень медленно. Как я могу его оптимизировать?
У datagridview есть 4-5 тысяч строк.
Я должен динамически генерировать datagridview по нескольким параметрам (данные из базы данных, количество столбцов)
Мне нужно создать datagridview, как это вертикально, из таблицы (id, name, contact) в базе данных.
Column1
Я бы
имя
контакт
Теперь рядом с столбцом1 может быть любое количество пустых столбцов .
В настоящее время я придерживаюсь такого подхода.
- Сначала добавим все пустые столбцы.
- Затем добавляем по три строки в каждой итерации цикла для каждой строки (id, name, contact).
-
Я извлекаю данные из базы данных и передаю их как 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()); }