DataGridView删除行仅删除备用行

我在DataGridView中有100行。 然后我删除每一行,如下所示,但因为它围绕ID循环进入0,2,4,6,8,因此它只删除偶数行。 这是怎么回事?

foreach (DataGridViewRow row in dgvData.Rows) { try { if (row.IsNewRow) continue; string PalletID = row.Cells[1].Value.ToString(); string Location = row.Cells[2].Value.ToString(); 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; } } 

我相信当你遍历网格并删除当前行时,它会弄乱网格的索引,到目前为止会导致行向上移动一级。 因此,当您继续前进到下一行时,它已经移动到您删除该行的索引。

你最好的选择是使用for循环并反向运行,这应该没问题。

问题是因为你在循环过程中更改了dgvData.Rows 。 如果你想删除循环中的项目,我认为你需要使用for而不是foreach

编辑更清楚:

当您在foreach循环中删除row ,第一次删除dgvData.Rows[0] ,并且dgvData.Rows[1]将成为新的dgvData.Rows[0] 。 所以第二次删除dgvData.Rows[1]它会删除原来的dgvData.Rows[2] ..等等。

试试这个

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

您正在使用ForEach循环并删除相同集合的行,即dgvData.Rows。 这是它从该集合中缺少一个对象而无法循环遍历每个项目。
所以要处理这个问题,你需要使用上面的代码从后面循环。

如果允许添加新行,则需要相应地为新行设置i的值….

对我来说唯一可能的是

  if (row.IsNewRow) continue; 

让我们跳过一些具有该属性的行…尝试放置一些调试消息。