2013-07-09 2 views
1

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

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

Я должен генерировать DataGridView как это вертикально из таблицы (идентификатор, имя, контактный) в базе данных. .

Column1

идентификатор
имя
контакт

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

В настоящее время я следую этому подходу.

  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.

+0

Зачем вам загружать 4-5 тысячи строк? Как часто пользователь проверяет 4-5 тысяч строк. Если три столбца и могут читать каждую ячейку за 1 секунду, которая еще читается до 3 часов. Страница в 100 или 1000 строк за раз. – Paparazzi

+0

Мне нужно создать этот тип данных, потому что работа с данными будет выполнена из этой сетки. – coding

+0

Это будет очень утомительная задача для оператора ввода данных. – coding

ответ

2

То, что я сделал это вместо того, чтобы добавлять на строки по одному в DataGridView. Я только что создал DataTable по моим данным и присвоил его DataSourceDataGridView.

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

+0

вы указали, что добавляете строки вручную, поэтому я предположил, что вы не хотите использовать DataBinding. иначе это был бы мой ответ. В DataBinding есть еще более оптимизированные способы приостановить обновление данных. –

+0

У меня было 20 000 строк в DataTable и попытался назначить источник данных datagridview, и он был чрезвычайно медленным – PUG

1

Calling 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()); 
} 
+1

Также см. Этот ответ: http://stackoverflow.com/a/4650185/12601 – Greg

+0

Что будет лучше приостановить краску при добавлении строк или использовании addrange. Или я должен использовать оба одновременно. i.e приостановить краску и добавить. – coding

+0

Мне это кажется легче, но вы можете попробовать каждый и посмотреть, что вам больше нравится. – Greg

2

Проблема заключается в том, что 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; 
+0

Мне пришлось вызвать Datagridview.Refresh() после WM_SETREDRAW, чтобы получить сетку, чтобы посмотреть полностью нарисованную. –

Смежные вопросы