Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从datagridview中删除多行_C# - Fatal编程技术网

C# 从datagridview中删除多行

C# 从datagridview中删除多行,c#,C#,我有一个datagridview,其中插入了值 Item PRID ------ ------ Item1 1 Item2 2 Item3 2 我试图将PRID与保存所选行PRID的变量进行比较。 我到目前为止所做的一切

我有一个datagridview,其中插入了值

    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\u PRID\u ForPurchaseOrder
的值等于2,那么它应该同时删除这两行。我也尝试过使用for循环,但它给出了索引超出范围的错误。它给出了以下错误

 Object Reference Not set to an instance of object

正如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));
var rowsToRemove=new List();
foreach(PurchaseOrder_dgv.Rows中的DataGridViewRow dgv_r)
{
if(dgv_r.Cells[1].Value.ToString()==CurrentSelected_PRID_for PurchaseOrder.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++;
}
inti=0;
而(i
解决这个问题的方法有两种。一是要做到以下几点

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
的底部循环,避免了在迭代时删除行的问题


我希望这会有所帮助。

您没有给出错误,但这可能与在
foreach
过程中删除元素有关。数据网格的底层数据源是什么?它是一个数据库,您可以从中删除行并重新绑定网格?它只是在有三行时不删除行,而是删除底部的两行并保留顶部的1行。数据是使用for循环手动插入gridview的。我已经更新了问题。如果我尝试此操作,它不会删除一行。从第一个示例中,它不会删除一行,也只是显示错误。@MJ192,对不起,我已经更新了第二个示例,您在for解决方案中遇到了什么错误?