2013-11-16 2 views
0

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

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

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

Uncommitted new row cannot be deleted.

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

+0

Лучше удалить записи из источника данных, чем пытаться удалить их из datagridview. – DOK

+0

Возможный дубликат: http://stackoverflow.com/questions/4950205/remove-row-from-datagridview –

ответ

2

Не используйте 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.

+0

Отлично, он работает как шарм! Спасибо, дорогой король Кинг! – Aan

0

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

foreach(DataGridViewRow row in dataGridView1.Rows) 
       { 

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

       } 
+0

Я пробовал свой код, но не все строки были удалены, даже если они удовлетворяют условию. – Aan

1

Попробуйте

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); 
    } 
    } 
} 
Смежные вопросы