情况:
在我的数据库中,我有一个表,其中记录可以引用同一个表中的其他记录。每条记录都有一个唯一的数字ID(自动ID列)和一个可以为空的列IDRef
,它可能包含要引用的记录的ID。
现在,在我的C#Windows窗体应用程序中,我使用DataGridView来允许用户编辑表中的记录。他可以添加,编辑或删除项目。我有一个用于保存数据的类型化DataSet和一个相应的TableAdapter来从数据库加载数据并执行更新。 DataGridView绑定到一个BindingSource,它使用类型化的DataSet作为其数据源。
对于IDRef
列,我添加了一个ComboBox列,它从与DataGridView本身相同的BindingSource填充其值。这意味着ComboBox始终与记录数量保持同步。
问题:
我在DataGridView中显示ID
列。通过单击DataGridView的相应行添加新行时,ID值将自动填充负值。只有在使用TableAdapter将更改保存到数据库后才会计算最终的自动ID值。
现在,当我下载IDRef
列的ComboBox时,我可以选择以前存在的记录(例如101,102等),但我也可以选择最后一次添加的记录更新到数据库(例如-1,-2,-3)。
现在:在我使用TableAdapter的Update
方法将更改保留到数据库之后,这些否定ID不再存在 - 我引用了不存在的记录(在我的情况下,这会导致外键约束错误)。
解决方案吗
我做的是:
这样可以确保用户只能通过按“应用”按钮选择已保留到数据库的值。
使用DataGridView控件在表中处理这种“自引用”是否有更优雅的方式?
编辑:更改标签以更好地适应主题
答案 0 :(得分:1)
当使用两个不同的表时,负ID问题由关系解决,编辑它的属性并将其设置为具有级联更新的外键。
我希望这也能用于自我引用,但这很棘手。
另外,我认为你应该为组合框提供不同的BindingSource(到同一个表)(或者绑定没有BindingSource)。
请注意,您还可以使用其他一些工具,例如Adapter.Update(dataRow)
答案 1 :(得分:0)