2012-02-27 3 views
0

Я пытаюсь добавить очень большое количество столбцов в datagridview, и у меня возникла сложная проблема. Когда количество столбцов становится слишком большим, код ниже добавляет столбцы очень медленно. Это зависит от значения size - когда оно меньше 10000, я получаю более или менее хороший результат (2-4 секунды, чтобы добавить это количество столбцов), но когда размер увеличивается до 15000 или более, время добавления не является пропорциональным вообще, для 30000 столбцов он может достигать 2 минут вместо 20-30 секунд, как я ожидаю. Итак, мой вопрос - можно ли как-то оптимизировать эту процедуру?Добавить тысячи столбцов в datagridview

datagridview.SuspendLayout(); 
int size = 10000; 
var columns = new DataGridViewColumn[size]; 
for (int i = 0; i < size; i++) 
      { 
       columns[i] = new DataGridViewTextBoxColumn(); 
       columns[i].Name = "col" + i; 
       columns[i].HeaderText = "col" + i; 
       columns[i].FillWeight = 0.00001f; 
      } 
datagridview.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; 
Array.ForEach(columns, item => datagridview.Columns.Add(item)); 
datagridview.ResumeLayout(); 

И это то, что я сделал:

int visibleColumns = 20; 
    string[] headers; 
    DataGridViewColumn[] columns; 
    HScrollBar hbar = new HScrollBar(); 

public Constructor(){ 
    ... 
    int sizeDezired = 15000; 
    int size = Math.Min(sizeDezired, visibleColumns); 
    columns = new DataGridViewColumn[size]; 
    headers = new string[sizeDezired]; 
    for (int i = 0; i < size; i++) 
    { 
     columns[i] = new DataGridViewTextBoxColumn(); 
     columns[i].Name = "col" + i; 
     columns[i].HeaderText = "col" + i; 
     columns[i].FillWeight = 0.00001f; 
    } 
    for (int i = 0; i < sizeDezired;i++) 
    { 
     headers[i] = "col" + i; 
    } 
    if (sizeDezired > size) 
    { 
     hbar.Maximum = sizeDezired - size; 
     hbar.Minimum = 0; 
     hbar.Value = 0; 
    } 
    hbar.Scroll += hbar_Scroll; 
    ... 
} 

    void hbar_Scroll(object sender, ScrollEventArgs e) 
    { 
     for (int i = 0; i < datagridview.ColumnCount; i++) 
     { 
      datagridview.Columns[i].HeaderText = headers[i + e.NewValue]; 
     } 
    } 
+0

Пожалуйста, не прикрепите свои заголовки к «C#» и тому подобное. Для этого нужны теги. –

+0

Каково ваше использование памяти в этот период? – starskythehutch

+3

Добавить меньше столбцов? –

ответ

1

Я добавил этот код:

int visibleColumns = 20;// columns that are in data grid view 
string[] headers;// headers for all desired columns 
DataGridViewColumn[] columns; 
HScrollBar hbar = new HScrollBar(); 

public Constructor(){ 
    ... 
    int sizeDesired = 15000; 
    int size = Math.Min(sizeDesired, visibleColumns); 
    columns = new DataGridViewColumn[size]; 
    headers = new string[sizeDesired]; 
    for (int i = 0; i < size; i++) 
    { 
     columns[i] = new DataGridViewTextBoxColumn(); 
     columns[i].Name = "col" + i; 
     columns[i].HeaderText = "col" + i; 
     columns[i].FillWeight = 0.00001f; 
    } 
    for (int i = 0; i < sizeDesired;i++) 
    { 
     headers[i] = "col" + i; 
    } 
    if (sizeDesired > size) 
    { 
     hbar.Maximum = sizeDesired - size; 
     hbar.Minimum = 0; 
     hbar.Value = 0; 
    } 
    hbar.Scroll += hbar_Scroll; 
    ... 
} 

void hbar_Scroll(object sender, ScrollEventArgs e) 
{ 
    for (int i = 0; i < datagridview.ColumnCount; i++) 
    { 
     datagridview.Columns[i].HeaderText = headers[i + e.NewValue]; 
    } 
} 

Здесь горизонтальная полоса прокрутки добавляется к циклу через все невидимые столбцы и сместить заголовки столбцов, чтобы визуально «прокрутки» через все столбцы (15000 в данном примере), но в действительности всего 20 столбцов. Этот код не использует привязку данных, меняются только заголовки, поэтому вам нужно изменить обработчик hbar_Scroll, чтобы отображать соответствующие данные в ячейках.

+0

Хорошая работа, вы избили меня до нее; У меня был почти такой же ответ. Следует отметить, что этот метод будет хорошо работать с VirtualMode, если есть очень большое количество строк. –

+0

Прохладный. Есть ли шанс обновить его для обработки «неограниченных» строк? Кстати, какие преимущества/недостатки имели VirtualMode для этой техники? –

0

Техника вы ищете называется нумерацией страниц. Посмотрите на следующий reference

«Paging является отличным способом, чтобы ограничить объем данных, отображаемых в пользователя в одно время, но это также очень хороший способ остановить много данных , передаваемых по сети , которые хранятся в памяти или больших запросов на базах ... это решает многие проблемы.

наиболее распространенным решением является (так же, как на поиске Google) это вы получите показан список страниц, и вы можете перемещаться по страницы либо идут вверх/вниз по странице за один раз или при нажатии на номер страницы.

Другой способ сделать это похоже на то, что на самом деле есть один большой список, но страница за кулисами, поэтому пользователь чувствует, что на самом деле это , просматривая один большой список. Пример, где вы видите, что это сделано, - в TFS. Вы можете сделать это с помощью сетки данных форм Windows (DataGridView).

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