0

値が挿入されたdatagridviewがあります。gridviewは次のようになります。

    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);
                    }
                }

しかし、2番目の行ではなく一番下の行が削除され、次のエラーが発生します。の値がCurrentSelected_PRID_ForPurchaseOrder2に等しい場合は、両方の行を削除する必要があります。forループを使用して試しましたが、インデックスが範囲外のエラーです。次のエラーが発生しています。

 Object Reference Not set to an instance of object
4

2 に答える 2

1

これを回避する方法はいくつかあります。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中にコレクションを編集しているためです。1つの解決策は、最初に同じ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 に答える