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

时间:2012-11-13 15:13:34

标签: c# dataset rowstate

  

可能重复:
  Error: Deleted row information cannot be accessed through the row. (C#)

我试图从我的DataSet中删除一行时出现此错误:

  

无法通过行

访问已删除的行信息

我该如何解决这个问题。

以下是我的功能:

    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();
       }
    }

3 个答案:

答案 0 :(得分:0)

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

修改

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

答案 1 :(得分:0)

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

  

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

     

在您使用Delete方法后,RowState变为已删除   现有的DataRow。在您调用AcceptChanges之前,它仍会被删除。在   这次,DataRow将从表中删除。

     

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

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

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

答案 2 :(得分:0)

我认为异常实际上是在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