Удаление нескольких элементов в коллекции, привязанной к datagridview, занимает целую вечность
-
03-07-2019 - |
Вопрос
Это не вопрос, потому что я уже ответил на него.Но это может быть полезно и другим тоже.
Вот что происходит:
- Создайте WinForm с Datagridview и привяжите Subsonic ...Коллекция, в которую загружено более 500 объектов
- Добавьте несколько столбцов в datagrid и сделайте хотя бы один autosizemode = заполнение
- Добавьте логику для удаления всех выбранных столбцов (т. е.при нажатии клавиши -> удалить)
- Отметьте все записи и удалите их
Это должно занять около 30 секунд.на высокопроизводительном ПК (и масштабируется:1 минута на 1000 ...)
Потому что:
Каждый раз, когда вы удаляете строку, запускается событие collections ListChanged, которое заставляет datagridview пересчитывать пространство, необходимое для автоматически изменяемого столбца (если кого-то интересуют "внутренние компоненты", я прикрепил график вызовов.
Решение
Решение:
При удалении отключите ListChangedEvent:
mycollection.RaiseListChangedEvents = false;
// Delete multiple rows
foreach(DataGridViewRow row In dataGridView.SelectedRows) {
dataGridView.Rows.Remove(row);
}
// After that you can re-enable the event:
mycollection.RaiseListChangedEvents = true;
// But you have to call
mycollection.ResetBindings();
//to let the datagridview perform at least one redraw.
Теперь та же задача выполняется в мгновение ока
Не связан с StackOverflow