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 :(得分:4)
您无法修改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 :(得分: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
答案 2 :(得分:0)
你不能删除foreach use for循环内部或删除List:
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();
}
答案 3 :(得分:0)
for (int i = 0;i < dt.Rows.Count; i++)
{
DataRow dr = dt.Rows[i];
if (dr["Degree"].ToString() == field)
{
dr.Delete();
i-=1;
}
}
dt.AcceptChanges();
您可以使用此循环。 对于任何人都可以找到这篇文章。