Intereting Posts
Получить акроним из строки в C # с помощью LINQ? Visual Studio: Как «Копировать в выходной каталог» без копирования структуры папок? Перезаписать существующее изображение C # “не содержит конструктор, который принимает аргументы” 1 “ DataGridView – использование DataPropertyName для отображения свойства дочернего элемента OnCheckedChanged обработчик события asp: checkbox не срабатывает при снятии флажка Clipboard.SetText (HTML) больше не работает Закрытие или закрытие соединения в базе данных Обновление пользовательского интерфейса в реальном времени ASP.NET MVC 2 – Html.EditorFor для типа с нулевым значением? Visual Studio 2013 не воссоздает файлы pdb Где скопировать gsdll32.dll, чтобы конвертировать PDF в конвертер изображений в моем приложении WPF? Запрос Wikipedia возвращает ошибку 403 Как вы получаете дубликат ключа, с которым завершилась ошибка ToDictionary ()? Доступ к Active Directory из ASP.Net MVC с использованием C #

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

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

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

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

Column1

Я бы
название
контакт

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

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

  1. Сначала добавим все пустые столбцы.
  2. Затем добавляем по три строки в каждой итерации цикла для каждой строки (id, name, contact).
  3. Я извлекаю данные из базы данных и передаю их как List в функцию 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 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 значительно улучшилась.

Проблема в том, что 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 empList) { List rows = new List(); 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()); }