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");
}
答案 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}的行已被删除,看起来就像你追求的结果。