无法通过该行访问已删除的行信息

本文关键字:删除 信息 访问 | 更新日期: 2023-09-27 18:35:22

>我有 2 个包含一个表的数据网格视图,以便为插入文本提供更多空间。补充一点,我不想显示前 2 列,它们包含主键和外键,我找到了一种在保存之前添加外键的方法(主键是自动递增的)。 现在保存它时,一切正常。但是当我想删除一行时....

就在数据集发送回数据库之前,我像这样添加那些外键,现在我必须这样做,否则adapt.Update()将抛出一个错误,指出该列不能为 null。

    private void SaveAnalyseTable()
    {
        dgvAnalyse1.EndEdit();
        dgvAnalyse2.EndEdit();
        for (int x = 0; x < dgvAnalyse1.Rows.Count-1; x++) //add to table, -1 else it will try to insert Id into an empty row (out of index error)
        {
            if (x != dgvAnalyse1.Rows.Count) //if it is the last one, don't execute
            {
                if (string.IsNullOrEmpty(patientsDataset.Tables["Analyse"].Rows[x]["PatientId"].ToString()) && (patientsDataset.Tables["Analyse"].Rows[x].RowState != DataRowState.Deleted)) .
                {
                    patientsDataset.Tables["Analyse"].Rows[x]["PatientId"] = currentPatient.PatientId;
                }
            }
        }
    }

在上面的代码中,我无法将这些外来数字添加到数据网格视图中,因为该列不存在当我尝试删除这样的行时,上面的代码中会抛出错误:

    private void btnAnalyseDelete_Click(object sender, EventArgs e)
    {
        foreach (DataGridViewRow item in dgvAnalyse1.SelectedRows)
        {
            dgvAnalyse1.Rows.RemoveAt(item.Index);
            int index = item.Index;
            if (index != -1)
            {
                patientsDataset.Tables["Analyse"].Rows[index].Delete();
            }
        }
        SaveAllData(); //even when saving the whole dataset to the database, still get the error
    }

所以:首先保存,然后删除不起作用,它会立即抛出错误。在保存之前删除它确实有效,它只是不能是相同的索引,所以它必须对我猜的数据集中的行做一些事情。

正在编辑 -> update数据集 -> 保存到数据库 -> 删除行 ->错误。

编辑 -> 更新数据集 -> 删除行 ->update数据集 -> 保存到数据库 -除非索引相同,否则>罚款

我敢肯定,在保存数据时,它会重新填充表的数据集。

无法通过该行访问已删除的行信息

当你调用SaveAnalyseTable时,你有一个测试来避免DataRowState.Deleted行和PatientID列的值为空或空的行,但你的逻辑应该考虑 && 运算符短路评估的影响

在您的情况下,PatientID为 null 或为空的测试发生在测试DataRowState.Deleted状态之前,因此在删除行的情况下也会执行。运算符 &&first 尝试验证表达式的第一部分(PatientID为 null 或空),但检查是否删除仅在第一部分之后发生。因此,第一次测试每次都会发生,此测试可能会尝试访问DataRowState.Deleted行。

您只需反转测试行为 null 或为空的顺序

if (patientsDataset.Tables["Analyse"].Rows[x].RowState != DataRowState.Deleted && 
    string.IsNullOrEmpty(patientsDataset.Tables["Analyse"].Rows[x]["PatientId"].ToString())