Я заполняю datagridview из datatable.
При заполнении столбцов и строк я также отформатирую их одновременно, это приводит к тому, что datagridview загружается очень медленно, есть ли проблема для этой проблемы?
Я заполняю datagridview из datatable.
При заполнении столбцов и строк я также отформатирую их одновременно, это приводит к тому, что datagridview загружается очень медленно, есть ли проблема для этой проблемы?
Также, заботясь о AutoSizeColumnsMode
, убедитесь, что в отдельных столбцах их свойство AutoSizeMode
также установлено на что-то, отличное от всех ячеек.
Я также счел необходимым использовать
SendMessage(dg.Handle, WM_SETREDRAW, false, 0); // before
// updates to datagridview here...
SendMessage(dg.Handle, WM_SETREDRAW, true, 0); // after
Я занял около 2-4 минут, чтобы загрузить 1-2k строк. Я изменил свойство auto-resize, и теперь это до нескольких секунд, возможно, 10-20. Я запустил это прямо перед циклом создания строки, чтобы убедиться, что он получил все столбцы.
foreach (DataGridViewColumn c in thisGrid.Columns)
{
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
}
С этим будет 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);
Вы можете проверить свойство DataGridView - AutoSizeColumnsMode Я обнаружил, что если я изменю режим от AllCells до DisplayedCells, производительность будет отличаться. Надеюсь, это поможет вам.
Когда вы используете представление datagrid для отображения данных из dataabse, вы всегда должны думать, чтобы использовать некоторую стратегию для ограничения набора результатов и отображения записей только тогда, когда пользователь действительно их видит. Это называется когда-то виртуальным режимом или пейджингом данных. Я получил пример этой стратегии для wpf, но есть что-то для winforms. Посмотрите и на этот вопрос: Winform DataGridview невероятно медленный по сравнению с MS Access Grid Я думаю, что это связано и с вашей проблемой.
Правила глупого старого человека: - ИЗБЕГАЙТЕ DataTable, хорошо известный как неэффективный - ИЗБЕГАЙТЕ, используя предварительное распределение строк [ "Grid" .Rowcount + "Grid" .AddRange() +..] (~ 5 раз медленнее, чем "Grid" ADD()) - Учтите, что DataGridView привязан к "вашему экрану": т.е. LOAD IT с несколькими экранами данных. - Я применил эти простые факты, и я могу "загрузить" "глупый файл" из 420 000 строк с 159 столбцами за 15 секунд. (~ 200 МБ).
У меня довольно хорошая производительность 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 столбцов дало мне значительное увеличение скорости в этой части кода.
Я провел некоторое тестирование в программе, где я загружаю 5000 строк с 6 столбцами, и каждая ячейка загружается номером строки только для того, чтобы иметь некоторые данные. Затем я использовал секундомер для проверки каждого подхода. Я загрузил dataviewgrid, отключил его и загрузил, затем включил его, спрятал, загрузил и показал, и приостанавливал и возобновлял. Я обнаружил, что, спрятав его и загрузив, а затем показывая, что это было намного быстрее в моем тестировании. Это заняло: .91 секунды, чтобы просто загрузить .91 секунд для suspendLayout, load, resumeLayout .25 секунды, чтобы отключить, загрузить и снова включить сетку .19 секунд, чтобы скрыть, загрузить и показать сетку.
Я бы согласился с тем, что вам следует избегать загрузки того, что вам не нужно, но подумал, что этот тест поможет.