我有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;罚款,除非相同的指数
我确信在保存数据时,它会重新填充表格的数据集。
答案 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())