现在我需要在DataTable删除我不需要的DataRow
DataTable  里面有4列,我是根据第一列去删除的,比如,如果我要删除,那么就删除第一列是0的所有行 foreach (DataRow drw in dtResult.Rows)
  {
  if (drw[0].ToString() == "0")
   {
     drw.Delete();
   }
    dtResult.AcceptChanges();
  }我现在写了上面的方法,但是执行到第二次就会报错,提示枚举之类的错误。想了很多方法都不稳妥,希望大家帮帮忙,多谢了

解决方案 »

  1.   

     foreach (DataRow drw in dtResult.Rows)
       {
       if (drw[0].ToString() == "0")
       {
       drw.Delete();
       }   
       }
       dtResult.AcceptChanges();
    应该这样,最后AcceptChanges。
      

  2.   

    delete方法只是打删除标记,AcceptChanges时才生效。
    如果你想直接删,不打标记的话,就用dt.Rows.Remove(dr)删。这样还需要考虑Index问题,并且foreach不允许你这么干。
      

  3.   

    大家好像都没说到点子上呀。
    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里删除,从而产生和上面一样的异常。
    因此,应当把它放循环体外,等所有删除标记都打完了再提交。