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

时间:2014-12-24 13:18:26

标签: c# database datagridview delete-row

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

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

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

        }
    }

在上面的代码中,我不能将这些外来号添加到datagridview,因为列不存在 当我试图删除这样的行时,错误在这里的代码中抛出:

    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

    }

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

编辑 - &gt; updateDataSet - &gt; SaveToDatabase - &gt;删除行 - &gt;错误。

编辑 - &gt; UpdateDataSet - &gt; deleteRow - &gt; updateDataSet - &gt; SaveToDatabase - &gt;罚款,除非相同的指数

我确信在保存数据时,它会重新填充表格的数据集。

1 个答案:

答案 0 :(得分:2)

当您致电SaveAnalyseTable时,您需要进行测试,以避免DataRowState.Deleted列为PatientID列的空值或空行,但您的逻辑应考虑短路评估的影响&安培;&安培;操作

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

您只需要将测试行的顺序颠倒为null或空

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