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;

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

最新更新