【发布时间】: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