删除多行会导致在2'处没有行位置。 IndexOutOfRangeException

时间:2017-07-06 07:28:06

标签: c# indexoutofrangeexception

Console.WriteLine("Enter how many rows you want to delete:");
del = Convert.ToInt16(Console.ReadLine());
try
{

    for (int i = 0; i <del; i++)
    {
        dt.Rows[i].Delete();
        dt.AcceptChanges();
    }

    Console.WriteLine("\n************************************\n");
}

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,每次删除行时,行都会“向上移动”,因此当您删除dt.Rows[0]时,dt.Rows[1]变为dt.Rows[0],因为您'通过索引访问每一行,而不是通过它的唯一标识符。下面是一个工作示例,如果你运行它将显示这个(我已经基于你的代码,所以你有一些上下文):

var dt = new DataTable();
dt.Columns.Add("IdColumn", typeof(int));
for (int i = 0; i < 10; i++)
{
    dt.Rows.Add(new object[] { i } );
}

var del = 3;

for (int i = 0; i < del; i++)
{
    dt.Rows[i].Delete();
    dt.AcceptChanges();
    Console.WriteLine("Deleted row number {0}, rows remaining in table are {1}, IdColumn for Rows[i] is {2}", i, dt.Rows.Count, dt.Rows[i]["IdColumn"]);
}

Console.WriteLine("\n************************************\n");

您可以使用的一个选项是使用LINQ并将以上内容替换为以下内容:

var dt = new DataTable();
dt.Columns.Add("IdColumn", typeof(int));
for (int i = 0; i < 10; i++)
{
    dt.Rows.Add(new object[] { i } );
}

var del = 3;

dt = dt.AsEnumerable().Skip(del).CopyToDataTable();

如果在运行第二个代码段后查看dt的内容,您应该会看到IdColumn的值为{0,1,2}的行已被删除,看起来就像你追求的结果。