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();
Run Code Online (Sandbox Code Playgroud)
执行此代码时会引发错误,因为“集合已修改,枚举操作可能无法执行”。为什么这样..?
您不能修改foreach. 尝试将此作为 apomene 答案的替代方法(几乎可以做同样的事情,除了使用列表的 remove 方法而不是索引。
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);
}
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您的问题。
您无法修改foreach. 所以不要删除或添加其中的东西。
您可以通过创建一个包含要修改的项目的新集合来防止此错误,例如使用 LINQ(这ToList()是必需的):
var toDelete = dt.AsEnumerable().Where(r => r["Degree"].ToString() == field).ToList();
Run Code Online (Sandbox Code Playgroud)
现在你可以毫无问题地循环它。
foreach(DataRow rowToDelete in toDelete)
rowToDelete.Delete();
dt.AcceptChanges(); // you could do that also in the loop now
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8460 次 |
| 最近记录: |