无法通过该行访问已删除的行信息
本文关键字:删除 信息 访问 | 更新日期: 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())