现在我需要在DataTable删除我不需要的DataRow
DataTable 里面有4列,我是根据第一列去删除的,比如,如果我要删除,那么就删除第一列是0的所有行 foreach (DataRow drw in dtResult.Rows)
{
if (drw[0].ToString() == "0")
{
drw.Delete();
}
dtResult.AcceptChanges();
}我现在写了上面的方法,但是执行到第二次就会报错,提示枚举之类的错误。想了很多方法都不稳妥,希望大家帮帮忙,多谢了
DataTable 里面有4列,我是根据第一列去删除的,比如,如果我要删除,那么就删除第一列是0的所有行 foreach (DataRow drw in dtResult.Rows)
{
if (drw[0].ToString() == "0")
{
drw.Delete();
}
dtResult.AcceptChanges();
}我现在写了上面的方法,但是执行到第二次就会报错,提示枚举之类的错误。想了很多方法都不稳妥,希望大家帮帮忙,多谢了
{
if (drw[0].ToString() == "0")
{
drw.Delete();
}
}
dtResult.AcceptChanges();
应该这样,最后AcceptChanges。
如果你想直接删,不打标记的话,就用dt.Rows.Remove(dr)删。这样还需要考虑Index问题,并且foreach不允许你这么干。
LZ的程序有2个问题: dtResult.AcceptChanges(); //1.这一步不能少 foreach (DataRow drw in dtResult.Rows)
{
if (drw[0].ToString() == "0")
{
drw.Delete();
}
//dtResult.AcceptChanges();
} dtResult.AcceptChanges(); //2.确认修改要放在这DataRow.Delete函数不会改变所属DataTable.Rows的前提是:
1.已经进行过DataTable.AcceptChanges操作
2.在下一次DataTable.AcceptChanges操作之前。
分析如下:
1.处:如果没有进行过AcceptChange,Delete函数会直接将DataRow从DataTable.Rows里删除。这时由于foreach循环操作的集合容积发生了变化,使foreach无法正常执行而抛出异常。可以把第一个AcceptChanges看作DataTable事务系统的开关,没打开它时DataTable是没有回滚功能的。
2.处:AcceptChanges在DataTable事务系统中相当于Commit与开启下一个事务的作用,如果把它放在循环体内将在每次循环结束提交修改,将DataRow从DataTable.Rows里删除,从而产生和上面一样的异常。
因此,应当把它放循环体外,等所有删除标记都打完了再提交。