2015-02-20 4 views
1
string field = ViewState["Field"].ToString(); 

DataTable dt = (DataTable)Session["Academic"]; 
foreach (DataRow dr in dt.Rows) 
{ 
     if (dr["Degree"].ToString() == field) 
     { 
      dr.Delete(); 
      dt.AcceptChanges(); 
     } 
} 
Session["Academic"] = dt; 
gdvwAcademic1.DataSource = Session["Academic"] as DataTable; 
gdvwAcademic1.DataBind(); 

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

+0

Вы видели дубликаты на SO в соответствии с этим исключением? –

+0

Возможный дубликат [Коллекция была изменена, операция перечисления не может выполняться] (http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute) – Magnus

ответ

1

Вы можете изменить коллекцию с помощью изделия foreach. Поэтому не удаляйте и не добавляйте в нее вещи.

Вы могли бы предотвратить эту ошибку, создав новую коллекцию предметов, которые вы хотите изменить, например, с помощью LINQ (ToList() важно):

var toDelete = dt.AsEnumerable().Where(r => r["Degree"].ToString() == field).ToList(); 

Теперь вы можете обходить это без проблем.

foreach(DataRow rowToDelete in toDelete) 
    rowToDelete.Delete(); 
dt.AcceptChanges(); // you could do that also in the loop now 
+0

Нет, все еще это не работает ... :-( – kls

+0

@kls: тогда попробуйте мой второй подход, я удалю первый. –

+0

Спасибо Тим Шмельтер, он работает. :-) – kls

0

вы не можете удалить внутри использовать Еогеасп для цикла или сделать удаление списка:

List <int> toBeDel=new List<int>(); 

    foreach (DataRow dr in dt.Rows) 
{ 
     if (dr["Degree"].ToString() == field) 
     { 
      toBEDel.Add(indexOf(dr)); 
     } 
} 

foreach (int i in toBeDel) 
{ 
    dt.Rows[i].Delete(); 
} 
+0

Спасибо апомену, он тоже работает ...! :-) – kls

2

Вы не можете изменить коллекцию в foreach. Попробуйте это в качестве альтернативы ответа apomene (в значительной степени делает то же самое, за исключением того, с помощью метода удалить из списка вместо индексов.

List<DataRow> toDelete = new List<DataRow>(); 

foreach(DataRow dr in dt.Rows){ 
    if(dr["Degree"].ToString() == field){ 
     toDelete.Add(dr); 
    } 
} 

foreach (DataRow dr in toDelete){ 
    dt.Rows.Remove(dr); 
} 

Это должно решить вашу проблему.

+1

очень хорошее решение ...! – kls

+0

@kls, если это решит вашу проблему. пожалуйста, подумайте о принятии его в качестве правильного ответа. –

Смежные вопросы