如何使用 Rowstate 和 Delete() 从数据集中删除行



可能的重复项:
错误:无法通过该行访问已删除的行信息。(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 用来确定如何处理行的状态

最新更新