Удаление нескольких элементов в коллекции, связанной с сеткой данных, занимает вечно - PullRequest
3 голосов
/ 30 апреля 2009

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

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

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

Это должно занять около 30 сек. на старшем ПК (и масштабируется: 1 мин для 1000 ...)

Причина:

Каждый раз, когда вы удаляете строку, запускается событие коллекций ListChanged, которое заставляет представление данных пересчитать пространство, необходимое для столбца с автоматическими размерами (если кто-то интересуется «внутренними компонентами», я прикрепил граф вызовов.

1 Ответ

0 голосов
/ 11 мая 2009

Решение:

При удалении отключите 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.

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

...