以下代码运行发生异常: 其他信息: 不能通过已删除的行访问该行的信息。 请教了,不是在DataTable.AcceptChanges()以后就可以删除行了么? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; namespace dtcopytest { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); DataColumn Column1 = new DataColumn("ID", typeof(int)); DataColumn Column2 = new DataColumn("No", typeof(int)); dt.Columns.Add(Column1 ); dt.Columns.Add(Column2); DataRow Row1 = dt.NewRow(); Row1[0] = 0; Row1[1] = 1; DataRow Row2 = dt.NewRow(); Row2[0] = 4; Row2[1] = 3; dt.Rows.Add(Row1); dt.Rows.Add(Row2); dt.AcceptChanges(); Console.WriteLine("--------dt原始-------"); for (int i = 0; i < dt.Rows.Count;i++ ) { for(int j=0; j < dt.Columns .Count ;j++) { Console.WriteLine(dt.Rows[i][j].ToString ()); } } int[,] testStr = new int[4, 2]; testStr[0, 0] = 0; testStr[0, 1] = 1; testStr[1, 0] = 2; testStr[1, 1] = 3; testStr[2, 0] = 4; testStr[2, 1] = 5; testStr[3, 0] = 6; testStr[3, 1] = 7; for (int i = 0; i < dt.Rows.Count;i++) { for (int j = 0; j < testStr.GetLength(0);j++ ) { if (Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0])) { dt.Rows[i].Delete(); } } } dt.AcceptChanges(); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { Console.WriteLine(dt.Rows[i][j].ToString()); } } } } } |
|
15分 |
dt.Rows[i].Delete();
break; |
断点调试,看 dt.Rows[i].Delete();之后
dt.AcceptChanges();之前,dt.Rows.Count到底变没变 dt.AcceptChanges()到底是干啥用的,怎么到处都乱加dt.AcceptChanges() |
|
5分 |
或者 if (dt.Rows[i].RowState!=DataRowState.Deleted && Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0]))
|
dt 里的row 已经删除一部分了,你再循环获取已删除的 row 肯定出错。
|
|
acceptchanges之后RowState就不是Deleted了 |
|
再来回复一下吧:找到问题了,以后有这种情况的TX可以不用发帖了
以下引用自: http://blog.csdn.net/xiao_jun_0820/article/details/4357568 当删除DataSet中某个Table里的Row时,只是将该Row的RowState设置成了Deleted,如果你仔细的话,会发现Rows.Count并没有变化,我们仍然可以通过循环找到该删除的行,但找到后,却不能访问该行保存的信息(比如ID字段),因为我们要取到这个假删的ID,然后通过ADO实现真正删除数据库记录. 我用如下方法: for (int i = 0; i < bugMgrDataSet.UserInfo.Rows.Count; i++) { if (bugMgrDataSet.UserInfo.Rows[i].RowState == DataRowState.Deleted) { userinfo.ID = (int)bugMgrDataSet.UserInfo.Rows[i]["ID"]; userinfobll.Delete(userinfo.ID); } } 会报错:不能通过已删除的行访问该行的信息. 这让我很是郁闷,在网上查询相关资料后,终于找到原因,原来bugMgrDataSet.UserInfo.Rows[i][“ID”]默认是按bugMgrDataSet.UserInfo.Rows[i][“ID”, DataRowVersion.Current]访问的,当前被删除了当然访问不到咯,于是改成bugMgrDataSet.UserInfo.Rows[i][“ID”, DataRowVersion.Original],奇迹出现了,取到ID的值了,原来被删除之后,就变成”过去式”了,要用DataRowVersion.Original来取原来的值. |