Удаление нескольких элементов в коллекции, привязанной к datagridview, занимает целую вечность

StackOverflow https://stackoverflow.com/questions/806605

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Вот что происходит:

  1. Создайте WinForm с Datagridview и привяжите Subsonic ...Коллекция, в которую загружено более 500 объектов
  2. Добавьте несколько столбцов в datagrid и сделайте хотя бы один autosizemode = заполнение
  3. Добавьте логику для удаления всех выбранных столбцов (т. е.при нажатии клавиши -> удалить)
  4. Отметьте все записи и удалите их

Это должно занять около 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top