删除动态的DT的指定行

一、怎么删除动态的DT中的指定行

 

采用datatable.Rows[i].Delete()删除行后再访问该表时出现出现“不能通过已删除的行访问该行的信息”的错误。

原因如下:

Delete()之后需要datatable.AccepteChanges()方法确认完全删除,因为Delete()只是将相应列的状态标志为删除,还可以通过datatable.RejectChanges()回滚,使该行取消删除。

所以如果要彻底删除datarow,需要Delete()和AccepteChanges()方法同时使用,或者采用datatable.Rows.RemoveAt(i)方法直接删除,其中i表示行索引,还有一个就是datatable.Rows.Remove(DataRow dr)删除指定行。

不过使用datatable.Rows.RemoveAt(i)要注意,如果连续使用datatable.Rows.RemoveAt(0);datatable.Rows.RemoveAt(1);这时并不是删除了原表中的0,1行,而是删除0行后,原来的1行就变成了0行,所以datatable.Rows.RemoveAt(1)实际删除的是原表的2行。

所以还是要慎用datatable.Rows.RemoveAt(i),若要删除多行,可以连续用Delete(),然后采用AccepteChanges()方法确认删除。

一点补充说明:

1、使用Remove()类似使用Delete()方法后,再调用AccepteChanges()方法

2、如果该行的 RowState 为 Added,则在调用 AcceptChanges 时,RowState 将变为 Detached,并且将从表中移除该行。

在对现有的 DataRow 使用 Delete 方法后,RowState 将变为 Deleted。在调用 AcceptChanges 之前,它一直保持为 Deleted。此时,将从表中移除 DataRow。可通过调用 RejectChanges 取消删除行。

3、确实要删除(以后不想恢复的话)  
  Eg:

(1)

DataRow.Delete()后要记住AcceptChanges   
     
  DataRow[]   drs   =   DataTabl1.Select("id=2   or   id=4");  
  for(   int   i=0   ;   i<drs.Count   ;   i++   )  
  {  
      DataTable1.Rows.Remove(   drs[i]   );  
  }

(2)

            System.Data.DataTable dt = this.ImportExcelToDataTable(stateDTO.OpenFileName);
            this.ExcelDTCount = dt.Rows.Count;
            System.Data.DataTable edt = dt.Copy();

           CensusData_TempModel cdModel = new CensusData_TempModel();
            try
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    cdModel.CensusName = dt.Rows[i][0].ToString();

                    cdModel.CensusCompany = dt.Rows[i][32].ToString();
                    CensusDataOutPutService.Insert_TempCensusData(cdModel);//先插入到临时表
                    edt.Rows[i].Delete();

                }

                  edt.AcceptChanges();
                  CensusDataOutPutService.InsertTrueCensusData();//在解析插入到真实表

              }
            catch
            {
                edt.AcceptChanges();
                CensusDataOutPutService.InsertTrueCensusData();//解析插入到真实表

二、动态为表格新增,删除行  

 

猜你喜欢

转载自blog.csdn.net/zcheva/article/details/5544382