首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#:如何在DataGridView中处理表的“自引用”?

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

Stack Overflow用户
提问于 2019-06-05 00:39:48
回答 2查看 0关注 0票数 0

情况:

在我的数据库中,我有一个表,其中记录可以引用同一个表中的其他记录。每个记录都有一个唯一的数字ID(自动ID列)和一个IDRef可以为空的列,该列可能包含要引用的记录的ID。

现在,在我的C#Windows窗体应用程序中,我使用DataGridView来允许用户编辑表中的记录。他可以添加,编辑或删除项目。我有一个用于保存数据的类型化DataSet和一个相应的TableAdapter来从数据库加载数据并执行更新。DataGridView绑定到使用类型化DataSet作为其数据源的BindingSource。

对于IDRef列,我添加了一个ComboBox列,它从与DataGridView本身相同的BindingSource填充其值。这意味着ComboBox始终与记录数量保持同步。

问题:

我正在IDDataGridView中显示该列。通过单击DataGridView的相应行添加新行时,ID值将自动填充负值。只有在使用TableAdapter将更改保存到数据库后,才会计算最终的自动ID值。

现在,当我下拉IDRef列的ComboBox时,我可以选择以前存在的记录(例如101,102等),但我也可以选择在上次更新数据库后添加的记录(例如 - 1,-2,-3)。

现在:在我使用TableAdapter的Update方法将更改保存到数据库之后,这些否定ID不再存在 - 我引用了不存在的记录(在我的情况下,这会导致外键约束错误)。

解?

我做的是:

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-06-05 09:22:05

Stack Overflow用户

发布于 2019-06-05 10:02:36

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档