【发布时间】:2009-06-09 12:45:38
【问题描述】:
情况:
在我的数据库中,我有一个表,其中的记录可以引用同一个表中的其他记录。每条记录都有一个唯一的数字 ID(自动 ID 列)和一个可为空的列 IDRef,其中可能包含要引用的记录的 ID。
现在,在我的 C# Windows 窗体应用程序中,我使用 DataGridView 来允许用户编辑表中的记录。他可以添加、编辑或删除项目。我有一个类型化的 DataSet 来保存数据和一个相应的 TableAdapter 来从数据库加载数据并执行更新。 DataGridView 绑定到使用类型化 DataSet 作为其数据源的 BindingSource。
对于 IDRef 列,我添加了一个 ComboBox 列,该列从与 DataGridView 本身相同的 BindingSource 填充其值。这意味着 ComboBox 始终与记录数保持同步。
问题:
我在 DataGridView 中显示 ID 列。通过单击 DataGridView 的相应行来添加新行时,ID 值会自动填充负值。只有在使用 TableAdapter 将更改持久化到数据库后,才会计算最终的 auto-ID 值。
现在当我下拉 IDRef 列的 ComboBox 时,我可以选择以前存在的记录(例如 101、102 等),但我也可以选择上次更新后添加的记录数据库(例如 -1、-2、-3)。
现在:在我使用 TableAdapter 的 Update 方法将更改持久化到数据库后,这些负 ID 不再存在 - 我正在引用不存在的记录(在我的情况下,这会导致外键约束错误)。
解决方案?
我所做的是:
- 为 ComboBox 列使用第二个 DataSet 和 BindingSource
- 添加一个“应用”按钮,使用 TableAdapter 更新对数据库的更改
- 将数据重新读取到绑定到 ComboBox 列的第二个 DataSet 中
这确保用户只能通过按“应用”按钮选择已持久化到数据库中的值。
有没有比使用 DataGridView 控件在表格中处理此类“自引用”更优雅的方法?
编辑:更改标签以更好地适应主题
【问题讨论】:
标签: c# data-binding datagridview