当前位置: 代码迷 >> C# >> 求大神!【不能通过已剔除的行访问该行的信息】
  详细解决方案

求大神!【不能通过已剔除的行访问该行的信息】

热度:89   发布时间:2016-05-05 04:25:55.0
求大神!【不能通过已删除的行访问该行的信息】
以下代码运行发生异常:
“System.Data.DeletedRowInaccessibleException”类型的未经处理的异常在 System.Data.dll 中发生 

其他信息: 不能通过已删除的行访问该行的信息。

请教了,不是在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());
                }
            }
        }
    }
}

------解决思路----------------------
dt.Rows[i].Delete();
break;
------解决思路----------------------
   或者 if (dt.Rows[i].RowState!=DataRowState.Deleted && Convert.ToString(dt.Rows[i][0]) == Convert.ToString(testStr[j,0]))