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

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

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

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

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

Причина:

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


person Jürgen Steinblock    schedule 30.04.2009    source источник
comment
кстати - я полагаю, вы имеете в виду = false (нижний регистр) и = true во второй раз.   -  person Marc Gravell    schedule 30.04.2009
comment
Если вторая часть является ответом, вы должны добавить ее в раздел ответов, а затем пометить как ответ. Затем люди могут проголосовать за него как за ответ, и вы получите репутацию в SO за то, что оставили хороший ответ (и, возможно, значок за ответ на свой вопрос).   -  person Dave Neeley    schedule 30.04.2009


Ответы (1)


Решение:

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

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

person Jürgen Steinblock    schedule 11.05.2009
comment
Я исправил опечатку true / false и поместил решение в раздел ответов (спасибо Марку Гравеллу и раномору) - person Jürgen Steinblock; 11.05.2009