for (int i=0;dt.Rows.Count;i++) 

    if (dt.Rows[i][2].ToString().Trim() == "") 
    { 
         dt.Rows[i].Delete();
    } 

dt.AcceptChanges(); 
网上说,我以前也用过,没有执行dt.AcceptChanges()句之前,dt.Rows[i].Delete();只是标注该行删除,实际是没有删除的,不影响dt.Rows.Count.
但今天另外写了一个东东,在没有执行dt.AcceptChanges()句之前,每执行一次dt.Rows[i].Delete();就dt.Rows.Count减了1,后在循环就有问题.
请问大家这是什么问题?

解决方案 »

  1.   

    从后往前删for (int i=dt.Rows.Count-1;i>=0;i--)
      

  2.   

    当然影响rows了,不影响数据库,rows在内存,删一条少一条,另外删除要倒着删for (int i=dt.Rows.Count-1;i>=0;i--) 

        if (dt.Rows[i][2].ToString().Trim() == "") 
        { 
             dt.Rows[i].Delete();
        } 
      

  3.   


    for (int i=0;i<dt.Rows.Count;i++) 

        if (dt.Rows[i][2].ToString().Trim() == "") 
        { 
             dt.Rows[i].Delete();
        } 

    dt.AcceptChanges();
      

  4.   

    这个不是Remove,也不是For Each,不影响的
      

  5.   

    可是网上说:
    Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,那就意味着,我执行dt.Rows[i].Delete();时,该后仍然还存在,只是作了一个标记而已,那么dt.Rows.Count也不应该减1.
      

  6.   

    DataTable的删除操作,是真实的内存删除DataTable。DefaultView或者数据源控件才是逻辑删除
      

  7.   

    DataTable绑定BindingSource之后,通过BindingSource删除也是逻辑删除,AccepteChanges()才有效
      

  8.   

    4楼,我这前写的也不影响,现在写的不知道为什么就影响了.唯一不同的是我现在写的这个是在界面临时创建的一个DataTable,之前的DataTable是通过从数据库里查询出来的.
      

  9.   

    当你循环delete删除的时候 datatable里面的数据肯定是删除了的 而你所说的标注datarow的Rowstate问题 这主要是用于Adapter来更新数据库的时候用的。AcceptChanges是将所有的dataRow的Rowstate更改为unchanged.我们通常对 DataSet里面的数据进行修改 然后调用 Adapter 来进行更新数据 原因是DataRow的Rowstate会变化 然后我们根据Rowstate来判断数据是否被修改 修改的话 调用update 则会更新数据库.
      

  10.   

    我测试了一下,你说的是对的,没有执行dt.AcceptChanges()句之前 ,是不影响dt.Rows.Count.
    你仔细检查下代码,你的dt.rows.count减1,是不是其他地方有影响到的,你重新建一个简单的程序,来测试一下。
      

  11.   

    是这样的,楼主的操作是delete,所以只是做了标记,直到调用AcceptChanges(),这在内存就就真的删除了。如果使用remove在内存中并不一定删除(如果还有其它引用的情况下),但会从Table中去掉了引用。
    如果用remove的话就最好从后向前删了
      

  12.   

    http://www.cnblogs.com/anncesky/articles/2443231.html
    你看看这篇文章下面的红字部分,看是否有帮助
      

  13.   

    你是自己建的table的话,如果是
    table.Rows.Add(newRow);
    这种的话,在后面加上一句
    table.AcceptChanges();
    然后再对他的row 进行delete(),就没问题了你肯定是少了一句table.AcceptChanges();