我在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;
}
}
答案 0 :(得分:7)
我相信当你遍历网格并删除当前行时,它会弄乱网格的索引,到目前为止会导致行向上移动一级。因此,当您继续前进到下一行时,它已经移动到您删除该行的索引。
你最好的选择是使用for循环并反向运行,这应该没问题。
答案 1 :(得分:1)
问题是因为您在循环过程中更改了dgvData.Rows
。
如果您想删除循环中的项目,我认为您需要使用for
而不是foreach
。
编辑更清楚:
当您在row
循环中删除foreach
时,第一次删除dgvData.Rows[0]
,dgvData.Rows[1]
将成为新的dgvData.Rows[0]
。因此,第二次删除dgvData.Rows[1]
时,它会删除原来的dgvData.Rows[2]
等等。
答案 2 :(得分:1)
试试这个
for (int i = dgvData.Rows.Count - 1; i >= 0; i--)
{
dgvData.Rows.Remove(dgvData.Rows[i]);
}
您正在使用ForEach循环并删除相同集合的行,即dgvData.Rows。那就是它从该集合中遗漏了一个对象而无法循环遍历每个项目 所以要处理这个问题,你需要使用上面的代码从后面循环。
如果新行允许添加新行,则需要相应地设置i的值....
答案 3 :(得分:0)
对我来说唯一可能的是
if (row.IsNewRow)
continue;
让我们跳过一些具有该属性的行...尝试在那里放置一些调试消息。