2012-02-13 1 views
1

Я создал DataGradView в C#, что позволяет мне свернуть и развернуть строки. выглядит так:C# Эффективность Datagridview страдает при спрячении многих строк

enter image description here

При запуске я хочу, чтобы свернуть все клиенты с несколькими entrys. Как показано на картинке. Если вы удовлетворены, если вы используете , не стесняйтесь спрашивать нас: customers is < 10.000 .

Код для сворачивания всех клиентов:

int number = 0; 
     int oldnumber = 0; 
     int parent = 0; 

     foreach (CustomDataGridViewRow row in dataGridView1.Rows) 
     { 
      try 
      { 
       number = int.Parse(row.Cells[1].Value.ToString()); 

       if (number != oldnumber && int.Parse(dataGridView1.Rows[row.Index + 1].Cells[1].Value.ToString()) == number) 
       { 
        row.Is_expander = true; 
        parent = row.Index; 

       } 
       if (number == oldnumber) 
       { 
        row.hide(parent); 
       } 
       oldnumber = number; 
      } 
      catch { } 
     } 

Еогеасп ряд, который должен разрушиться я называю row.hide(parent), которые устанавливают видимость ложь и сохраняет родительский индекс.

Еогеасп родительской строки значок будет нарисован

Можете ли вы догадаться, почему это занимает так много времени, чтобы скрыть все эти строки? Может быть, после того, как каждый экран скрытой строки снова проиграет? Возможно, я делаю ненужные или тяжелые вещи в цикле? Я понятия не имею

ответ

3

Вы можете использовать VirtualMode с DataGridView, чтобы очень эффективно обновлять сетку. См. Эту статью: http://msdn.microsoft.com/en-us/library/ms171622.aspx

Если вы выполняете рендеринг> 10000 виртуальных режимов, это необходимо!

+2

Просто установка virtualmode = true не показало никакого результата. Кстати: он также кажется, что он занимает экспоненциальное время, чтобы скрыть все строки. 5000 строк за 2 секунды и 20 000 строк за 2 минуты –

+1

Прочтите статью, на которую ссылается, виртуальный режим больше, чем просто логическое свойство. Вы должны обрабатывать различные события, которые запускаются для заполнения видимого окна ячеек. Я создал сгруппированную сетку, которая может отображать 100 000 + строк, используя этот подход. – ColinE

+0

Какие события точно уволены при скрытии строки? Вы скрываете или удаляете строки? Ive выяснил, что удаление и добавление более эффективно, чем скрытие. –

0

Необходимо ли выбрать все 10000 строк с самого начала. Можно отображать данные на разных страницах, начиная с 1-9,10-19,20-19 и т. Д. Это повысит производительность, а также обеспечит систему пейджинга. Почему вы не можете изменить запрос?

+0

Необходимо выбрать все 10000 строк с начала –

+1

, тогда лучше всего выполнить вычисления внутри sp/sql и вернуть набор данных и назначить его gridviews datasource – kbvishnu

2

Скрыть и показать строки на datagridview очень медленно, потому что только Microsoft знает, я думаю. Однако, копируя строки в массив, манипулируя ими в массиве и копируя их обратно в сетку, очень быстро. Вот какой-то код:

DataGridViewRow[] theRows = new DataGridViewRow[Adgv.Rows.Count]; 
Adgv.Rows.CopyTo(theRows, 0); 
Adgv.Rows.Clear(); 
for (int loop = 0; loop < theRows.Length; loop++) theRows[loop].Visible = false; 
Adgv.Rows.AddRange(theRows); 

Это делается менее чем за секунду для 35000 строк. В моем коде у меня обычно есть выражение, которое определяет, должна ли строка быть скрытой или показана, и она выражается в том, что она выполняется менее чем за секунду. Если я попытаюсь выполнить эту операцию без копирования, это займет несколько минут. Иди цифра!

+0

Из всего этого я попробовал, этот работал для меня (без данных DatagridView) Спасибо. – MwBakker

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