2015-06-01 18 views
0

形势 DataGridView中删除:错列被绑定到DataAdapter的

我正在写使用C#在VS2013与.NET4.0 WinForms应用程序。

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

插入和修改此工作正常。

问题

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

问题

怎样更改这项安排,以便删除将正常工作?很明显,根本问题是在数据库更新发生之前该行已从网格中消失,但我不知道如何解决该问题。我怀疑这个解决方案可能在于通过不同的事件处理事情,但我不确定是哪一个。

+0

不要直接从datgridview中删除数据。从数据表中删除数据,datagridview应该自动更新。 DataGridview和dataTable的行号应该始终相同。 – jdweng

+0

谢谢@jdweng。因此,现在在UserDeletingRow中,我手动删除所需的行,重新填充适配器,然后刷新datagridview。这_appears_很好,所需的行从网格中消失。但是,在数据库中,所需的行已经被_and_光标所在的新行删除。后者可能是因为RowValidated仍然被触发,导致适配器的更新。那么,我该如何a)提示Update方法来处理删除所需的行,或者b)手动删除所需的行,并阻止Update执行后续的删除。 – ifinlay

+0

您已绕过命令构建器。命令生成器执行Select命令并创建三个附加命令:更新,插入和删除。我认为你需要全部4条命令才能使更新正常工作。更新需要能够删除行。 – jdweng

回答

0

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

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

解除了这个工作,但这看起来像一个很不雅的解决方案。感激的是,如果有人知道处理这个问题的一种狡猾的方式。我很想知道CommandBuilder会使用什么逻辑。 (可惜我不能使用CommandBuilder,因为我的插入和更新需要执行Unix_TIMESTAMP转换)。