一、怎么删除动态的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();//解析插入到真实表
二、动态为表格新增,删除行