0

我有一个数据网格视图,其中插入了值。网格视图是这样的。

    Item                PRID                 
   ------              ------               
    Item1                1
    Item2                2
    Item3                2

我正在尝试将 PRID 与保存所选行 PRID 的变量进行比较。到目前为止我所做的。

                foreach (DataGridViewRow dgv_r in PurchaseOrder_dgv.Rows)
                {
                    if (dgv_r.Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString())
                    {
                        PurchaseOrder_dgv.Rows.Remove(dgv_r);
                    }
                }

但它删除了底行而不是第二行。并给出以下错误。我想要的是如果值CurrentSelected_PRID_ForPurchaseOrder等于 2,那么它应该删除两行。我也尝试过使用 for 循环,但它给了我索引超出范围错误。它给出以下错误。

 Object Reference Not set to an instance of object
4

2 回答 2

1

有几种方法可以解决这个问题。一是做到以下几点

for (int i = dataGridView1.RowCount - 1; i >= 0; i--)
    if (String.Compare(dataGridView1.Rows[i].Cells[1].Value.ToString(), "2") == 0)
        dataGridView1.Rows.Remove(dataGridView1.Rows[i]);

这是从底部循环的DataGridView,避免了在迭代时删除行的问题。

我希望这有帮助。

于 2012-05-29T18:24:17.833 回答
0

正如 mellamokb 指出的那样,原因是您在 foreach 期间编辑了集合。一种解决方案是先将具有相同 PRID 的行存储在列表中,然后再将其删除。像这样的东西

var rowsToRemove = new List<int>();

foreach (DataGridViewRow dgv_r in PurchaseOrder_dgv.Rows)
{
    if (dgv_r.Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString())
    {
        rowsToRemove.Add(dgv_r.Index);
    }
}

rowsToRemove.Reverse();
rowsToRemove.ForEach(i => PurchaseOrder_dgv.Rows.RemoveAt(i));

另一种解决方案是使用 while 循环,它考虑到集合大小变化的可能性。

int i = 0;
while (i < PurchaseOrder_dgv.Rows.Count)
{
    if (PurchaseOrder_dgv.Rows[i].Cells[1].Value.ToString() == CurrentSelected_PRID_ForPurchaseOrder.ToString())
    {
        PurchaseOrder_dgv.Rows.RemoveAt(i);
    }
    i++;
}
于 2012-05-29T18:18:56.093 回答