【问题标题】:C#: How to handle "self-references" for tables within DataGridView?C#:如何处理 DataGridView 中表的“自引用”?
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,目前我确实有第二个 DataSet 和 BindingSource 用于组合。这很好用——只有在我可以选择任何东西之前我必须按下“应用”按钮。这就是为什么我想知道是否有更优雅的方法。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多