C#:如何在DataGridView中处理表的“自引用”?

时间:2009-06-09 12:45:38

标签: c# data-binding datagridview

情况:

在我的数据库中,我有一个表,其中记录可以引用同一个表中的其他记录。每条记录都有一个唯一的数字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不再存在 - 我引用了不存在的记录(在我的情况下,这会导致外键约束错误)。

解决方案吗

我做的是:

  • 为ComboBox列使用第二个DataSet和BindingSource
  • 添加“应用”按钮,使用TableAdapter
  • 更新对数据库的更改
  • 将数据重新读入绑定到ComboBox列的第二个DataSet

这样可以确保用户只能通过按“应用”按钮选择已保留到数据库的值。

使用DataGridView控件在表中处理这种“自引用”是否有更优雅的方式?

编辑:更改标签以更好地适应主题

2 个答案:

答案 0 :(得分:1)

当使用两个不同的表时,负ID问题由关系解决,编辑它的属性并将其设置为具有级联更新的外键。

我希望这也能用于自我引用,但这很棘手。

另外,我认为你应该为组合框提供不同的BindingSource(到同一个表)(或者绑定没有BindingSource)。

请注意,您还可以使用其他一些工具,例如Adapter.Update(dataRow)

答案 1 :(得分:0)