【问题标题】:Wrong row gets deleted in DataGridView bound to DataAdapter在绑定到 DataAdapter 的 DataGridView 中删除了错误的行
【发布时间】:2015-08-14 19:42:18
【问题描述】:

情况

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

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

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

问题

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

问题

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

【问题讨论】:

  • 不要直接从 datgridview 中删除数据。从数据表中删除数据,datagridview 应该会自动更新。 DataGridview 和 dataTable 的行号应该始终相同。
  • 谢谢@jdweng。所以现在在 UserDeletingRow 我手动删除所需的行,重新填充适配器,然后刷新 datagridview。这出现很好,并且所需的行从网格中消失了。然而,在数据库中,所需的行已经光标落到了新的行上。后者可能是因为 RowValidated 仍然被触发导致适配器的更新。那么我该如何 a) 提示 Update 方法来处理所需行的删除或 b) 手动删除所需行并阻止 Update 执行后续删除。
  • 您已绕过命令生成器。命令生成器采用 Select 命令并创建三个附加命令:Update、Insert 和 Delete。我认为您需要所有 4 个命令才能使更新正常工作。更新需要能够删除行。
  • 我已经定义了所有四个适配器命令 Select、Update、Insert 和 Delete。问题是 Delete 删除了错误的行。我可以手动删除正确的行,但 adapter.Update 仍然会继续删除“新”当前行。
  • 也许 datagridview 没有正确更新并且数据表是正确的。尝试设置datasource = null,然后回到表datasource = dt。这将强制 datagridview 更新。

标签: c# mysql datagridview delete-row dataadapter


【解决方案1】:

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

  • 在 UserDeletingRow 事件中,我正在存储要删除的行的主键值。
  • 在 RowValidated 中,我调用适配器。更新我首先使用存储的主键来构建正确的 SQL 删除命令。即使该行已经从 dgv 中删除,数据库删除现在也可以正常工作。

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

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2010-12-08
    • 1970-01-01
    • 2023-03-16
    • 2021-04-28
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多