L'eliminazione di più elementi in una raccolta associata a una vista dati richiede un'eternità
-
03-07-2019 - |
Domanda
Questa non è una domanda, perché ho già risposto. Ma può essere utile anche per gli altri.
Ecco cosa succede:
- Crea un WinForm con Datagridview e associa una raccolta Subsonic ... con più di 500 oggetti caricati su di esso
- Aggiungi alcune colonne al datagrid e crea almeno un autosizemode = fill
- Aggiungi logica per eliminare tutte le colonne selezionate (ad es. premendo il tasto - > elimina)
- Contrassegna tutti i record ed eliminali
Questo dovrebbe richiedere circa 30 secondi. su un PC di fascia alta (e aumenta: 1 minuto per 1000 ...)
Causa:
Ogni volta che si elimina una riga viene generato l'evento ListChanged delle raccolte che provoca il datagridview per ricalcolare lo spazio necessario per la colonna ridimensionata automaticamente (se qualcuno è interessato a " internals " Ho allegato un grafico di chiamata.
Soluzione
Soluzione:
Durante l'eliminazione, disabilitare 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.
Lo stesso compito ora richiede solo un battito di ciglia
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow