【问题标题】:Preventing row change when a database error encountered遇到数据库错误时防止行更改
【发布时间】:2015-08-22 21:40:55
【问题描述】:

情况:

我正在 VS2013 中使用 C# 开发一个 winforms 应用程序。

我有一个通过 DataAdapter 绑定到 MySQL 表的 datagridview。每当用户从已编辑的行点击到新的行时,就会发生行验证和数据库更新。行验证在 RowValidating 中处理,dataadapter.Update 在 RowValidated 中处理。

问题:

如果在 RowValidating 中发生验证错误,那么我可以使用 Cancel = true 来停止更新并将错误行保持为当前选择。然而,当数据库更新时验证也可能失败(例如,数据库约束或并发阻止更新)。我可以捕获这些,但由于我现在在 RowValidated 中,因此 Cancel = true 不再可用。结果,我最终将旧行标记为错误,但选择已移至新行。

问题:

有没有什么方法可以放弃进一步的处理,特别是一旦事情进展到 RowValidated 中的更新,就转移到新行?换句话说,在 RowValidated 中是否有一些 Cancel = true 的类似物?

【问题讨论】:

  • 在实际行验证通过后将 dataadapter.Update 移动到 RowValidating 事件处理程序。如果更新失败,设置Cancel = true那里
  • 谢谢@Fabio。不幸的是,当在 RowValidating 中调用 dataadapter.Update 时,它​​什么也不做。我想在那个阶段它假设没有要提交的更改。
  • 您在异常中捕获了更新失败?您可以存储之前的行号并将其重置在 catch..
  • @TaW 这就是我认为我最终不得不做的事情。不过似乎很不满意。整个 dgv“离开一行的更新”简直就是一场噩梦,当我以为它是 .Net 的面包和黄油的东西时。对于像 MS Access 这样不那么复杂的产品,这“可以正常工作”。

标签: c# winforms validation datagridview row


【解决方案1】:

https://msdn.microsoft.com/en-us/library/ms229603.aspx 找到了解决方法。

上面写着:

如果您有在验证之后发生的自定义验证 事件,它不会影响数据绑定。例如,如果您有 尝试取消数据绑定的 Validated 事件中的代码, 数据绑定仍然会发生。在这种情况下,要执行验证 在 Validated 事件中,更改控件的 Data Source Update Mode 属性(在(数据绑定)(高级)下)从 OnValidation 到 Never, 并将 Control.DataBindings[""].WriteValue() 添加到您的 验证码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多