我第一次从数据集中删除所有好的 但第二次它给了我这个错误 无法通过该行访问已删除的行信息。
private void button9_Click(object sender, EventArgs e)
{
foreach (DataRow row in ds.Tables["emp"].Rows)
{
if (row[0].ToString() == textBox6.Text)
{
row.Delete();
break;
}
}
}
答案 0 :(得分:3)
通常在枚举时从集合中删除将引发异常:
Collection was modified; enumeration operation might not execute.
在这种情况下,如果尚未添加数据行,则调用DataRow.Delete()
不会删除该行;它会将RowState
设置为Deleted
,但在您致电AcceptChanges
之前,该行仍会保留在集合中(请参阅DataRow.Delete()
的文档。)
因此该行仍在DataTable
中,并且第二次枚举集合时,代码会尝试访问字段值并获得异常:
DeletedRowInaccessibleException: Deleted row information cannot be accessed through the row.
要避免此错误,您可以致电AcceptChanges
提交删除,或查看@Grant Winney链接的答案中提到的RowState
。
要查看此示例,您可以运行以下代码:
var table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Rows.Add("foo");
table.Rows.Add("bar");
table.AcceptChanges();
foreach(DataRow row in table.Rows)
{
if ((string)row["Name"] == "foo")
{
row.Delete();
}
}
Console.WriteLine(table.Rows[0].RowState); // Deleted
Console.WriteLine(table.Rows.Count); // 2
table.Rows[0].AcceptChanges();
Console.WriteLine(table.Rows.Count); // 1