L'eliminazione di più elementi in una raccolta associata a una vista dati richiede un'eternità

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

  •  03-07-2019
  •  | 
  •  

Domanda

Questa non è una domanda, perché ho già risposto. Ma può essere utile anche per gli altri.

Ecco cosa succede:

  1. Crea un WinForm con Datagridview e associa una raccolta Subsonic ... con più di 500 oggetti caricati su di esso
  2. Aggiungi alcune colonne al datagrid e crea almeno un autosizemode = fill
  3. Aggiungi logica per eliminare tutte le colonne selezionate (ad es. premendo il tasto - > elimina)
  4. 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.

È stato utile?

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
scroll top