DataGridView La suppression de lignes supprime uniquement les lignes alternatives

J’ai 100 lignes dans un DataGridView. Je supprime ensuite chaque ligne comme indiqué ci-dessous, mais lorsqu’elle tourne autour de l’ID, elle entre 0,2,4,6,8 et donc elle ne supprime que les lignes paires. Que se passe-t-il?

foreach (DataGridViewRow row in dgvData.Rows) { try { if (row.IsNewRow) continue; ssortingng PalletID = row.Cells[1].Value.ToSsortingng(); ssortingng Location = row.Cells[2].Value.ToSsortingng(); dgvData.Rows.Remove(row); AddToList(PalletID + " located in " + Location + " was uploaded"); } catch (Exception ex) { MessageBox.Show("Error Uploading Data"); AddToList("Error uploading data " + ex.Message); continue; } } 

Je crois que lorsque vous parcourez la grid et supprimez la ligne en cours, vous vous trompez avec l’index de la grid qui, à partir de maintenant, entraînerait un changement de niveau des lignes. Ainsi, au fur et à mesure que vous avancez vers la ligne suivante, il s’est déjà déplacé vers l’index dans lequel vous avez supprimé la ligne.

Votre meilleur pari serait d’utiliser une boucle for et de l’exécuter en sens inverse, ce qui devrait bien se passer.

Le problème vient du fait que vous avez modifié dgvData.Rows cours du processus de boucle. Je pense que vous devez utiliser for au lieu de foreach , si vous souhaitez supprimer des éléments de la boucle.

EDIT Pour être plus clair:

lorsque vous supprimez la row dans la boucle foreach , la première fois, elle supprimera dgvData.Rows[0] et dgvData.Rows[1] deviendra le nouveau dgvData.Rows[0] . Donc, la deuxième fois, quand il supprime dgvData.Rows[1] il supprime en réalité le dgvData.Rows[2] original dgvData.Rows[2] .. etc.

essaye ça

 for (int i = dgvData.Rows.Count - 1; i >= 0; i--) { dgvData.Rows.Remove(dgvData.Rows[i]); } 

vous utilisez la boucle ForEach et supprimez les lignes de la même collection, c.-à-d. dgvData.Rows. C’est qu’il manque un object de cette collection et n’a pas réussi à parcourir tous les éléments.
Donc, pour gérer cela, vous devez boucler en arrière en utilisant le code ci-dessus.

Vous devez définir la valeur de i en conséquence pour la nouvelle ligne si elle permet d’append une nouvelle ligne ….

La seule chose qui m’est possible, c’est que

  if (row.IsNewRow) continue; 

laissez-vous passer certaines lignes qui ont ces propriétés … Essayez d’y placer un message de débogage.