在绑定到DataAdapter

时间:2015-06-01 11:08:19

标签: c# mysql datagridview delete-row dataadapter

场合

我正在使用带有.NET4.0的VS2013中的C#编写Winforms应用程序。

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

对于插入和修改,这工作正常。

问题

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

问题

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

1 个答案:

答案 0 :(得分:0)

好的,当我从dgv引用CurrentRow时,生成SQL Delete命令不起作用,因为在我构建参数和执行适配器的时候。更新dgv行已经消失了。这就是我最终删除错误行的原因。所以我已经解决了这个问题:

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

放心使这个工作,但这似乎是一个非常不优雅的解决方案。感激如果有人知道一种更流畅的处理方式。我很想知道CommandBuilder会使用什么逻辑。 (遗憾的是我无法使用CommandBuilder,因为我的插入和更新需要进行Unix_TIMESTAMP转换)。