Лучший способ заполнить DataGridView большим количеством данных - PullRequest
22 голосов
/ 27 августа 2010

У меня есть форма окна, в которой есть два DataGridView (DGV), которые будут содержать более 25 000 записей и 21 столбец в каждом. Я успешно загрузил каждый с данными из БД, используя DataAdapter, а затем я попытался просто заполнить DGV, используя для циклов. Каждый метод занимал примерно одинаковое количество времени. В первый раз, когда данные заполняются в DGV, это занимает слишком много времени (7+ минут), а затем последующие моменты времени становятся гораздо более разумными (~ 30 секунд). Поэтому мой вопрос: как лучше всего загрузить DGV большим объемом данных, который в среднем займет <= 1 мин? Мне действительно нравится функциональность DGV, но если дело доходит до толчка, я готов использовать другую технологию, даже если это означает отказ от некоторых из этих функций. </p>

Ответы [ 6 ]

34 голосов
/ 27 августа 2010

Существует в основном 3 способа отображения данных в DataGridView

  • Создание строк вручную в цикле, как вы сейчас делаете: как вы заметили, это очень неэффективноесли у вас много данных

  • Используйте виртуальный режим DataGridView, как предложил Джонатан в своем комментарии: DGV создает только столько строк, сколько может быть отображено, идинамически изменяет их содержимое, когда пользователь прокручивает.Вам необходимо обработать событие CellValueNeeded, чтобы предоставить необходимые данные для DGV

  • Использовать привязку данных: это, безусловно, самый простой способ.Вы просто заполняете DataTable данными из базы данных, используя DbDataAdapter, и назначаете это DataTable свойству DataSource DGV.DGV может автоматически создавать столбцы (AutoGenerateColumns = true), или вы можете создавать их вручную (вы должны установить DataPropertyName столбца на имя поля, которое вы хотите отобразить).В режиме привязки данных DGV работает как в виртуальном режиме, за исключением того, что он заботится о получении данных из источника данных, поэтому вам нечего делать.Это очень эффективно даже для большого количества строк

6 голосов
/ 20 октября 2012

Я думаю, что вы можете использовать метод DataReader вместо DataAdapter. DataReader - очень эффективный односторонний компонент, потому что он только читает данные из источника, и вы можете заполнять таблицу данных циклично.

2 голосов
/ 12 июня 2013

Если у вас огромное количество строк, например, 10 000 и более,

, чтобы избежать потери производительности - перед привязкой данных сделайте следующее:

dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; 
//or even better .DisableResizing. 
//Most time consumption enum is DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
dataGridView1.RowHeadersVisible = false; // set it to false if not needed

после привязки данных вы можете включить его.

1 голос
/ 09 июня 2016

это решило мою проблему:

array<DataGridViewRow^>
    ^theRows = nullptr;
if (DG->Rows->Count == 0)//First Compilation
{
    int NUMROWS = xxx;
    theRows = gcnew array<DataGridViewRow^>(NUMROWS);
    for (int nr = 0; nr < DRH->Count; nr++)
        theRows[nr] = gcnew DataGridViewRow();
//Do not remove the two following
    DG->Rows->AddRange(theRows);
    DG->Rows->Clear();
}
else //Update
{

    theRows = gcnew array<DataGridViewRow^>(DG->Rows->Count);
    DG->Rows->CopyTo(theRows, 0);
    DG->Rows->Clear();

}
for(int nr=0;nr<theRows->Length;nr++)
{
    theRows [nr]->SetValues("val1", "val2");
}
DG->Rows->AddRange(theRows);
1 голос
/ 15 декабря 2013

Попробуйте использовать DataTable. Заполните. Затем используйте DataView. Назначьте его источнику данных DataGridView.

//DataView dataView = new DataView(dataTable);
//this.Grid.DataSource = dataView;

Вы получите очень МАЛЕНЬКОЕ время отклика для больших файлов (25000 записей и 21 столбец в секунду). Моя шаблонная программа заняла 7 секунд, чтобы загрузить 100 000 строк * 100 столбцов {с глупым содержимым -> номер строки как строка}

0 голосов
/ 22 февраля 2017

Я не уверен, что это именно то, о чем вы спрашиваете, но мне нравится создавать подмножество данных для начальной загрузки, а затем включать функцию поиска. Это очень легко сделать с помощью Visual Studio 15 и источников данных / наборов данных. В обозревателе решений откройте файл dataset.xsd. Он будет называться DataSet.xsd. Перейти к таблице данных в вопросе. Щелкните правой кнопкой мыши и добавьте запрос. Обычно я просто добавляю «TOP 1000» в свой запрос. Таким образом, выберите * из mytable становится выбрать ТОП 1000 * из mytable

Наконец, дважды щелкните форму, чтобы найти метод _load, и измените «Заполнить», чтобы использовать новый запрос. Это лучше всего продемонстрировать на примере:

Первая строка кода, которую я закомментировал, - это то, что Vis Stud создал по умолчанию. Второй - тот, который я добавил, который получит только 1000 лучших записей.

        private void Form_Customers_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'stage2DataSet.customers' table. You can move, or remove it, as needed.
        /* this.customersTableAdapter.Fill(this.stage2DataSet.customers); */
        this.customersTableAdapter.FillBy_Top_1000(this.stage2DataSet.customers);


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