2011-06-28 16 views
4

DataGridViewに100行あります。私は、次に示すように各行を削除しますが、IDの回りにループするので、0,2,4,6,8となり、その結果偶数行だけが削除されます。どうしたの?DataGridView行を削除すると、代替行だけが削除されます

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

答えて

7

グリッドをループして現在の行を削除すると、現在のグリッドのインデックス行を上にシフトさせる必要があります。次の行に進むと、既に行に移動したインデックスに移動しています。

あなたの最善の策は、forループを使用し、それを逆に実行することです。これはうまくいくはずです。

+0

奇妙なことに私は同じループを行う削除ボタンがありますが、それは行ではなく選択された行の上にあり、それはうまく動作します。 – Jon

+0

'SelectedRows'はまったく別のコレクションなので、このケースではDataGridViewの実際の行を実行していると思います – V4Vendetta

0

私には可能である唯一の事は、あること

if (row.IsNewRow) 
    continue; 

みましょうあなたはプロパティが...そこにいくつかのデバッグメッセージを配置するようにしてくださいことを持っている一部の行をスキップします。

+0

....それは新しい行を追加することができます場合は、新しい行のためにそれに応じて、iの値を設定する必要が

は、だから私は毎回あなたと仮定し – Jon

+0

を続けます行を削除すると、 "for each"ステートメントはインデックスで駄目です。たぶんあなたは手動インデックスまたはfor(グリッドの行の数を毎回知っている場合)のwhile条件を使用する必要があります:) – DonCallisto

1

ループスルー処理中にdgvData.Rowsを変更したために問題が発生しています。 ループ内のアイテムを削除する場合は、foreachの代わりにforを使用する必要があると思います。

あなたがforeachループ、それがdgvData.Rows[0]を削除し、dgvData.Rows[1]は新しいdgvData.Rows[0]なり、初めてにしてrowを削除する場合:より明確にする

EDIT。だから二度目にはdgvData.Rows[1]を削除すると、元のdgvData.Rows[2]などが削除されてしまいます。

1

を使用すると、foreachループを使用して、同じコレクション、すなわちdgvData.Rowsの行を削除している。この

for (int i = dgvData.Rows.Count - 1; i >= 0; i--) 
{ 
    dgvData.Rows.Remove(dgvData.Rows[i]); 
} 

を試してみてください。それはそのコレクションからのオブジェクトが欠落していて、各アイテムをループできませんでした。
これを処理するには、上記のコードを使って後ろからループする必要があります。あなたが、私はそれをデバッグしてきたし、そのその介さない

関連する問題