在绑定到 DataAdapter 的 DataGridView 中删除了错误的行

Wrong row gets deleted in DataGridView bound to DataAdapter

情况:

我正在 VS2013 中使用 C# 和 .NET4.0 编写一个 Winforms 应用程序。

我有一个 datagridview,我将其绑定到链接到 MySQL table 的 DataAdapter。我正在使用 DataAdapter 的更新方法执行更新。由于 MySQL table 中对日期和布尔值的非常规处理,我设置了自己的 SQL 命令,而不是使用 CommandBuilder。这些由调用 Update 之前设置的参数提供。我在 RowValidated 上调用更新。

插入和修改这个工作正常。

问题:

在 datagridview 中,当用户选择一行时,我希望他们能够点击删除并将该行从网格和数据库中删除。当我尝试这个时,该行从 datagridview 中消失,当然光标移动到不同的行。但是被删除的 database 行是光标所在的新 datagridview 行。这几乎可以肯定是因为我使用 datagridview.CurrentRow 来设置删除命令的参数,并且我假设在这个阶段当前行确实发生了变化。

问题:

如何修改此安排以便删除操作正常进行?显然,潜在的问题是在数据库更新发生之前该行已从网格中消失,但我不确定如何解决该问题。我怀疑解决方案可能在于通过不同的事件来处理事情,但我不确定是哪个。

好的,当我从 dgv 引用 CurrentRow 时,生成 SQL 删除命令不起作用,因为在我构建参数并执行 adapter.Update 时,dgv 行已经消失。这就是为什么我最终删除了错误的行。所以我是这样解决的:

  • 在 UserDeletingRow 事件中,我存储了被删除行的主键值。
  • 在我调用 adapter.Update 的 RowValidated 中,我首先使用存储的主键构建正确的 SQL 删除命令。即使该行已经从 dgv 中删除,数据库删除现在也可以正常工作。

松了一口气让它工作,但这似乎是一个非常不优雅的解决方案。如果有人知道处理这个问题的更巧妙的方法,我们将不胜感激。我很想知道 CommandBuilder 会使用什么逻辑。 (遗憾的是我不能使用 CommandBuilder,因为我的插入和更新需要进行 Unix_TIMESTAMP 转换)。