Удалить строку в 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);
}
}
}