La eliminación de varios elementos en una colección vinculada a una vista de datos lleva una eternidad

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Esto no es una pregunta, porque ya la respondí. Pero también puede ser útil para otros.

Esto es lo que sucede:

  1. Cree un WinForm con un Datagridview y vincule un Subsonic ... Colección con más de 500 objetos cargados en él
  2. Agregue algunas columnas al datagrid y haga al menos un autosizemode = fill
  3. Agregar lógica para eliminar todas las columnas seleccionadas (es decir, al presionar una tecla - > eliminar)
  4. Marcar todos los registros y borrarlos

Esto debería tomar unos 30 segundos. en una PC de gama alta (y escala: 1 min por 1000 ...)

Causa:

Cada vez que eliminas una fila, se activa el evento ListChanged de las colecciones, lo que hace que la vista datagrid recalcular el espacio necesario para la columna de tamaño automático (si alguien está interesado en el " internals " adjunto un gráfico de llamadas.

¿Fue útil?

Solución

Solución:

Al eliminar, deshabilite el evento de evento de cambio de lista:

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.

La misma tarea ahora solo toma un abrir y cerrar de ojos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top