С# очень медленное заполнение 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 секунд, чтобы скрыть, загрузить и показать сетку.
Я бы согласился с тем, что вам следует избегать загрузки того, что вам не нужно, но подумал, что этот тест поможет.