С# очень медленное заполнение datagridview

Я заполняю datagridview из datatable.

При заполнении столбцов и строк я также отформатирую их одновременно, это приводит к тому, что datagridview загружается очень медленно, есть ли проблема для этой проблемы?

Ответ 1

Также, заботясь о AutoSizeColumnsMode, убедитесь, что в отдельных столбцах их свойство AutoSizeMode также установлено на что-то, отличное от всех ячеек.

Я также счел необходимым использовать

SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before

// updates to datagridview here...

SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after

Ответ 2

Я занял около 2-4 минут, чтобы загрузить 1-2k строк. Я изменил свойство auto-resize, и теперь это до нескольких секунд, возможно, 10-20. Я запустил это прямо перед циклом создания строки, чтобы убедиться, что он получил все столбцы.

foreach (DataGridViewColumn c in thisGrid.Columns)
{
    c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
}

Ответ 3

С этим будет datagridview быстро, как java jtable:)

public static class ExtensionMethods
{
    public static void DoubleBuffered(this DataGridView dgv, bool setting)
    {
        Type dgvType = dgv.GetType();
        PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
            BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(dgv, setting, null);
    }
}

ExtensionMethods.DoubleBuffered(dataGridView1, true);

Ответ 4

Вы можете проверить свойство DataGridView - AutoSizeColumnsMode Я обнаружил, что если я изменю режим от AllCells до DisplayedCells, производительность будет отличаться. Надеюсь, это поможет вам.

Ответ 5

Когда вы используете представление datagrid для отображения данных из dataabse, вы всегда должны думать, чтобы использовать некоторую стратегию для ограничения набора результатов и отображения записей только тогда, когда пользователь действительно их видит. Это называется когда-то виртуальным режимом или пейджингом данных. Я получил пример этой стратегии для wpf, но есть что-то для winforms. Посмотрите и на этот вопрос: Winform DataGridview невероятно медленный по сравнению с MS Access Grid Я думаю, что это связано и с вашей проблемой.

Ответ 6

Правила глупого старого человека: - ИЗБЕГАЙТЕ DataTable, хорошо известный как неэффективный - ИЗБЕГАЙТЕ, используя предварительное распределение строк [ "Grid" .Rowcount + "Grid" .AddRange() +..] (~ 5 раз медленнее, чем "Grid" ADD()) - Учтите, что DataGridView привязан к "вашему экрану": т.е. LOAD IT с несколькими экранами данных. - Я применил эти простые факты, и я могу "загрузить" "глупый файл" из 420 000 строк с 159 столбцами за 15 секунд. (~ 200 МБ).

Ответ 7

У меня довольно хорошая производительность DataGridView. Добавление нескольких сотен строк занимает около 200 мс. Вот что я делаю:

virtual = true - использование представления виртуализованной сетки данных, похоже, ускоряет весь процесс. Просто не забудьте правильно реализовать logViewGrid_CellValueNeeded.

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

logViewGrid.SuspendLayout();
// add data, perform some operations on grid view
logViewGrid.ResumeLayout(false);

У меня также была проблема с медленной раскраской строк; мой метод для этого заключался в настройке стиля каждой ячейки отдельно, например:

gridViewInstance.Rows[currentRow].Cells[cellIndex].Style.BackColor = val;

Вместо этого я пошел за:

gridViewInstance.Rows[currentRow].DefaultCellStyle.BackColor = val;

Что для 30 столбцов дало мне значительное увеличение скорости в этой части кода.

Ответ 8

Я провел некоторое тестирование в программе, где я загружаю 5000 строк с 6 столбцами, и каждая ячейка загружается номером строки только для того, чтобы иметь некоторые данные. Затем я использовал секундомер для проверки каждого подхода. Я загрузил dataviewgrid, отключил его и загрузил, затем включил его, спрятал, загрузил и показал, и приостанавливал и возобновлял. Я обнаружил, что, спрятав его и загрузив, а затем показывая, что это было намного быстрее в моем тестировании. Это заняло: .91 секунды, чтобы просто загрузить .91 секунд для suspendLayout, load, resumeLayout .25 секунды, чтобы отключить, загрузить и снова включить сетку .19 секунд, чтобы скрыть, загрузить и показать сетку.

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