Удалить строку в DataGridView C#

Я пытался перебрать мой dataGridView1 и удалите строки, которые не удовлетворяют условию, следующим образом:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
    {
        dataGridView1.Rows.Remove(row); //error: Uncommitted new row cannot be deleted.
    }
}

Но я получил эту ошибку:

Новая запись не может быть удалена.

Я могу управлять, если код также VB.NET.

3 ответа

Решение

Не использовать foreach в этом случае зацикленная коллекция может быть изменена и приводит к непредсказуемому результату, иногда выдает исключение, как коллекция была изменена (встречается в основном в LINQ), используйте for вместо:

 for(int i = dataGridView1.RowCount-1; i >= 0; i--){
   var row = dataGridView1.Rows[i];
   if (!row.IsNewRow&&!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0){
      dataGridView1.Rows.Remove(row);
   }
 }

Обратите внимание, что мы должны перейти от наибольшего индекса к 0.

Пытаться

foreach (DataGridViewRow row in dataGridView1.Rows)
{
 if (!(row.Cells.OfType<DataGridViewCell>().All(c=>c.Value == null))
  {
   if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
   {
     dataGridView1.Rows.Remove(row);
   }
  }
}

Попробуйте поставить следующее условие:

foreach(DataGridViewRow row in dataGridView1.Rows)
                {

                  if(!row.IsNewRow)
                  {
                     if (!(Convert.ToDateTime(row.Cells[7].Value) - DateTime.Today).Days <= 0)
                     {
                       dataGridView1.Rows.Remove(row);
                     }
                  }

                }
Другие вопросы по тегам