Добавить тысячи столбцов в datagridview - PullRequest
1 голос
/ 27 февраля 2012

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

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];
        }
    }

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

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

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 голосов
/ 27 февраля 2012

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

"Пейджинг - это отличный способ ограничить количество данных, отображаемых пользователю за один раз, но это также очень хороший способ остановки лотовданных, передаваемых по сети, хранящихся в памяти или больших запросов к базам данных ... Это решает много проблем.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...