を使用してコレクションを反復処理する場合、コレクションをforeach
変更しないでください。最良のシナリオでは、コレクション全体をカバーすることはありません。ただし、ほとんどの場合、foreach
ブロック内でコレクションを変更すると、反復は失敗します。
DataGridView から行を削除するには、for
反復ブロックまたは 2 段階のプロセスを使用する必要があります。その両方を以下に示します。
for
反復ブロック
この手順では、インデックスを使用してコレクションをトラバースし、コレクションを変更します。ここで知っておく必要があるのは、コレクションを変更する場合は、インデックスの増分がない (コレクションを進む) ということです。インデックスをデクリメントします (コレクションをさかのぼります)。前方への反復中にコレクションを変更 (アイテムの削除または追加) すると、コレクション内のすべてのアイテムにアクセスできない場合があります。
DataGridView から行を削除するコードを次に示します。覚えておいてください、後方に繰り返します。
for (int i = dgv01.Rows.Count - 1; i >= 0; i--)
{
if (dgv01.Rows[i].Cells[0].Value.ToString() == "abc")
{
dgv01.Rows.RemoveAt(i);
}
}
foreach
反復ブロック
この手順では、2 段階のアプローチを使用します。最初のステップで削除するアイテムを見つけ、2 番目のステップでコレクションからアイテムを削除します。この 2 段階のプロセスは、先ほど説明した理由から必要です。
今コード。これは2 段階のプロセスであることを忘れないでください。
// step 1. find the items to be removed
//items to be removed will be added to this list
var itemsToRemove = new List<DataGridViewRow>();
foreach (DataGridViewRow r in dgv01.Rows)
{
if (r.Cells[0].Value.ToString() == "abc")
{
itemsToRemove.Add(r);
}
}
//step 2. remove the items from the DataGridView
foreach (var r in itemsToRemove)
{
// this works because we're not iterating over the DataGridView.
dgv01.Rows.Remove(r);
}
最後に 1 つ知っておくべきことは、ここで説明した手順はDataGridViewRowCollection
クラスだけに適用されるわけではないということです。IList<T>
またはICollection<T>
インターフェイスを実装するすべてのコレクションに適用されます。そうです、このプロセスは、List、Dictionaries、ControlCollection、およびその他すべての同様のクラスに使用できます。