可能的重复项:
错误:无法通过该行访问已删除的行信息。(C#)
当我尝试从我的数据集中删除一行时,我收到此错误:
无法通过该行访问已删除的行信息
我该如何解决这个问题。
这是我在下面的函数:
private void btnDelete_Click(object sender, EventArgs e)
{
var result = MessageBox.Show("Proceed to deleting this location?", "Delete Location", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (result == DialogResult.Yes)
{
var row = myData.xspArea.FindByxar_Id(pRow.xar_Id);
if (row.RowState != DataRowState.Deleted)
{
row.Delete();
MessageBox.Show("This location has been deleted", "Location Deleted", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
{
this.Close();
}
}
可能值得阅读 MSDN 文档以了解row.Delete()
应该做什么。
如果行的"行状态"为"已添加",则"行状态"将变为"已分离"和 调用 AcceptChanges 时,将从表中删除该行。
行状态变为已删除后,在 现有数据行。它保持"已删除"状态,直到您调用"接受更改"。在 这一次,数据行将从表中删除。
可以通过调用拒绝更改来取消删除已删除的行。
因此,row.Delete()
会将row.RowState
更改为 DataRowState.Deleted
.
如果要实际从数据集中删除行,则需要调用 row.AcceptChanges()
。
我假设异常实际上是在FindByxar_Id(pRow.xar_Id)
上引发的,而不是稍后在row.Delete();
上提出的。您是否创建了具有pRow
的 DataRow 的副本,或者是否也删除了该行(可能通过级联删除约束)?然后,您无法访问该xar_Id
,因为它已被删除。
因此,还要检查这一点:
// ...
if(pRow.RowState != DataRowState.Deleted)
{
var row = myData.xspArea.FindByxar_Id(pRow.xar_Id);
if (row.RowState != DataRowState.Deleted)
{
row.Delete();
// ...
}
// ...
如果要更新数据库,则需要使用DataAdapter
。
我认为您需要在行后调用mData.AcceptChanges()
。删除()。
编辑:
正如@Tim施梅特所说: AcceptChanges
将阻止数据库中的更新,因为行状态是 datadapter 用来确定如何处理行的状态