-1

可能重复:
错误:无法通过行访问已删除的行信息。(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();
       }
    }
4

3 回答 3

0

我认为您需要mData.AcceptChanges()在 row.Delete() 之后调用。

编辑:

正如@Tim Schmelter 所说: AcceptChanges将阻止数据库中的更新,因为行状态是数据适配器用来确定如何处理该行的内容

于 2012-11-13T15:19:10.413 回答
0

可能值得阅读MSDN 文档以了解row.Delete()应该做什么。

如果该行的 RowState 已添加,则当您调用 AcceptChanges 时,RowState 将变为 Detached,并且该行将从表中删除。

对现有 DataRow 使用 Delete 方法后,RowState 变为 Deleted。在您调用 AcceptChanges 之前,它一直处于已删除状态。此时,DataRow 已从表中删除。

可以通过调用 RejectChanges 取消删除已删除的行。

因此,row.Delete()将更row.RowState改为DataRowState.Deleted.

如果您希望从 DataSet 中实际删除您的行,则需要调用row.AcceptChanges().

于 2012-11-13T15:20:54.453 回答
0

我假设该异常实际上是在FindByxar_Id(pRow.xar_Id)而不是稍后提出的row.Delete();。您是否创建了 DataRow 的副本,pRow或者该行是否也被删除(可能通过级联删除约束)?然后您无法访问,xar_Id因为它已被删除。

所以也检查一下:

// ...
if(pRow.RowState != DataRowState.Deleted)
{
    var row = myData.xspArea.FindByxar_Id(pRow.xar_Id);
    if (row.RowState != DataRowState.Deleted)
    {
        row.Delete();
        // ...
    }
// ...

如果要更新数据库,则需要使用DataAdapter.

于 2012-11-13T15:20:57.977 回答