代码之家  ›  专栏  ›  技术社区  ›  Thorsten Dittmar

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

  •  3
  • Thorsten Dittmar  · 技术社区  · 16 年前

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

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

    问题:

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

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

    现在:使用TableAdapter后 Update 方法将更改持久化到数据库中,这些负ID不再存在——我引用的是不存在的记录(在我的例子中,这会导致外键约束错误)。

    解决方案?

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

    还有比这更优雅的方法来使用DataGridView控件处理表中的此类“自引用”吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Henk Holterman    16 年前

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

    另外,我认为您应该为组合框(或绑定但不绑定BindingSource)使用不同的BindingSource(到同一个表)。

    请注意,您还可以使用其他一些工具,如Adapter。更新(dataRow)