2015-01-03 7 views
3

Это мой код, чтобы удалить строку из DataTable:Невозможно удалить строки из DataTable, потому что «Коллекция была изменена, операция перечисления не может выполнить»

DataTable dtapple = dt; 

foreach (DataRow drapplicant in dtapple.Rows) 
{ 
    int iapp = Convert.ToInt32(drapplicant["SrNo"].ToString()); 

    if (drapplicant["PassportExpDate"].ToString().Trim() != "") 
    { 
     //ViewState["iapp"] = drapplicant; 
     dtapple.Rows.Remove(drapplicant); 
    } 
} 

Теперь, когда я использую выше код строки удаляется, но после того, как что я получаю с ошибкой

Коллекция была изменена; операция переписи может не выполняться

Не знаю точно, почему.

+0

возможно дубликат [Ошибка в DataRow, Коллекция была изменена; операция перечисления может не выполняться] (http://stackoverflow.com/questions/15457571/error-in-datarow-collection-was-modified-enumeration-operation-might-not-execut) –

+0

Решение в связанном вопросе ужасно , С temp DataTables и вложенными циклами: - \ – t3chb0t

+0

Ну, вы еще это решили? – t3chb0t

ответ

0

Ниже код работает для меня:

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    var tempRow = dataTable.Rows[i]; 
    var temp = dataTable.Rows[i][0]; 
    for (int j = 0; j < dataTable.Rows.Count; j++) 
    { 
     DataRow rows = dataTable.Rows[j]; 
     if (temp == rows[0].ToString()) 
     { 
      tempdatatable.Rows.Add(tempRow[0], tempRow[1]); 
      dataTable.Rows.Remove(rows);  //Update happen here 
     } 
     tempdatatable.DefaultView.Sort = "gscitations DESC"; 
     dataGridView1.DataSource = tempdatatable; 
    } 
} 
0

Попробуйте это:

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    var tempRow = dataTable.Rows[i]; 
    var temp = dataTable.Rows[i][0]; 
    for (int j = 0; j < dataTable.Rows.Count; j++) 
    { 
     DataRow rows = dataTable.Rows[j]; 
     if (temp == rows[0].ToString()) 
     { 
      tempdatatable.Rows.Add(tempRow[0], tempRow[1]); 
      dataTable.Rows.Remove(rows);  //Update happen here 
     } 
     tempdatatable.DefaultView.Sort = "gscitations DESC"; 
     dataGridView1.DataSource = tempdatatable; 
    } 
} 
+0

Не работает – Bhupendra

+0

, где вы получаете ошибку? –

+0

Когда цикл возвращается снова – Bhupendra

1

Вы получаете эту ошибку, потому что коллекция не должна изменяться в то время как итерация его. Чтобы удалить некоторые предметы из коллекции, вам обычно нужна вторая коллекция, которую вы итерации, не меняя ее.

Для вашего DataTable вам нужно сначала получить строки, которые хотите удалить, и поместить их в новую коллекцию. Один из способов добиться этого с LINQ:

Давайте создадим некоторые тестовые данные:

DataTable dt = new DataTable(); 
dt.Columns.Add("Test", typeof(bool)); 
DataRow dr1 = dt.NewRow(); 
DataRow dr2 = dt.NewRow(); 
DataRow dr3 = dt.NewRow(); 

dr1["Test"] = true; 
dr2["Test"] = false; 
dr3["Test"] = false; 

dt.Rows.Add(dr1); 
dt.Rows.Add(dr2); 
dt.Rows.Add(dr3); 

затем получить только строки, где значение в Test Колонку false и поместить их в List<DataRow>:

var removeRows = 
    dt 
    .AsEnumerable() 
    .Where(r => (bool)r["Test"] == false) 
    .ToList(); 

сейчас вы можете его передразнивать, используя новый removeRows лист и удалять из него предметы первой необходимости (здесь DataTable.Rows)

// Remove selected rows. 
foreach (var row in removeRows) 
{ 
    dt.Rows.Remove(row); 
} 

В вашем запросе этого должно работать:

var removeRows = 
    dtapple 
    .AsEnumerable() 
    .Where(r => string.IsNullOrEmpty(r["PassportExpDate"].ToString()) == false) 
    .ToList(); 

Если вы используете string.IsNullOrEmpty() нет необходимости Trim() его.

+0

где я могу поместить этот код? – Bhupendra

+0

Извините, я пропустил условие и обновил пример. – t3chb0t