从数据集中删除旧记录并重新加载视图 c#

Delete old records from DataSet and reload view c#

在 ADO.NET 中,我的 DataSet 对象有 class。在 Window 表单应用程序中,我有 3 个链接的列表框。 1. 显示 nr,2. table 中的 "name" 值和 3. table 中的 "description" 值。当我向数据集中添加一个新行时,我可以将其删除,但问题是当我试图从一开始就删除数据集中的行时。 正在删除:

int licznik = 0;
foreach(DataRow datarow in bez.dset.Tables["typ"].Rows)
{
    if(datarow["nazwa"].ToString() == listBox2.SelectedItem.ToString())
    {
        break;
    }
    licznik++;
}

bez.dset.Tables["typ"].Rows[licznik].Delete();

baz 是一个 class 的 DataSet 对象。 当我刷新 listBoxes 时出现错误,无法访问已删除的信息。我做错了什么?

Delete 方法不会从数据集中删除行 table。它只是标记 DataRow.RowState with the enum DataRowState.Deleted。如果您尝试使用 RowState = DataRowState.Deleted 引用 DataRow,则会引发上述错误。

如果您想将更改保存回数据库,则需要这种方法。如果您考虑一下,如果删除的行在 DataSet table 中不再存在,您如何设法从数据库 table 中删除该行?

如果你想从内存数据中删除删除的行table那么你需要调用

bez.dset.Tables["typ"].AcceptChanges();

此调用将您的更改应用于内存中的 DataTable,将每一行 RowState 更改为 DataRowState.Unchanged 并删除已删除的行。当然,在此调用之后 ADO.NET 类 之类的 DbDataAdapter 不再能够将您的更改保存回数据库。

如果您在 Datatable 中将 RowState 设置为 DataRowState.Deleted 的 DataRow,那么您需要在尝试使用它之前检查每个 RowState

foreach (DataRow drow in bez.dset.Tables["typ"].Rows) 
{
   if(drow.RowState != DataRowState.Deleted)
   {
       string value = drow.Field<string>("NameOfYourColumnOfStringType");
       ..... whatever you want to do with it....
   }
}