2009-04-30 8 views
3

Ce n'est pas une question, parce que je l'ai déjà répondu. Mais cela peut aussi aider les autres.La suppression de plusieurs éléments dans une collection liée à un datagridview prend une éternité

Voici ce qui se passe:

  1. Créer une WinForm avec un Datagridview et lier une subsonique ... Collection avec plus de 500 objets chargés à lui
  2. Ajouter des colonnes à la grille de données et de faire au moins un AutoSizeMode = remplissage
  3. logique Ajouter à supprimer toutes les colonnes sélectionnées (par exemple à chaque touche -> supprimer)
  4. Marquez tous les dossiers et les supprimer

Cela devrait prendre environ 30 secondes. sur un PC haut de gamme (et échelles: 1 min pour 1000 ...)

Cause:

Chaque fois que vous supprimez une ligne collections événement ListChanged est tiré ce qui provoque la datagridview recalculer l'espace nécessaire à la colonne autosized (si quelqu'un est intéressé par les "internes" Je joint un graphe d'appel

+0

btw - Je suppose que vous voulez dire "= faux" (minuscule), et "= vrai" la deuxième fois. –

+1

Si la deuxième partie est la réponse, vous devez l'ajouter à la section des réponses, puis la marquer comme réponse. Alors les gens peuvent le considérer comme la réponse, et vous obtenez la réputation sur SO pour avoir laissé une bonne réponse (et peut-être un badge pour répondre à votre propre question). –

Répondre

0

Solution:.

Lors de la suppression, désactivez la 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. 

La même tâche ne prend maintenant qu'un clin d'œil

+0

J'ai corrigé la faute de frappe vrai/faux et j'ai mis la solution dans la section réponse (merci à Marc Gravell et ranomore) –

Questions connexes