【问题标题】:CellValueChanged vs CellValidating Events for DataGridViewDataGridView 的 CellValueChanged 与 CellValidating 事件
【发布时间】:2010-08-12 15:57:14
【问题描述】:

为 DataGridView 实现验证逻辑代码和条件格式代码的最佳位置是什么?

在我读过的有关此控件的许多书籍和文章中,似乎建议为此处理的适当事件是 CellValidating 事件。 嗯,这个名字也暗示了这一点。

但是,根据我的口味,此事件触发的频率有点高,我不确定它是否需要。 例如,每次用户切换到另一行时都会触发此事件。

另一方面,CellValueChanged 事件似乎仅在单元格的值更改时触发,这意味着验证代码仅在值更改时运行,而不是每次用户更改单元格时运行。

现在,由于很多书籍都使用 CellValidating 事件,我想知道使用 CellValueChanged 是否没有任何问题(例如显示中)?

我知道在使用简单的验证和条件突出显示规则时对性能的影响应该是无关紧要的,但如果可以避免的话,我更希望它不要在每次用户移动到另一个单元格时运行无用的代码。

谢谢,

【问题讨论】:

  • 取决于您遵循的设计模式(如果有)。从技术上讲,您应该将业务逻辑从 UI 层中移除,并使用某种 ValidationObject 来验证表示层中的数据,然后将结果发送回您的视图。
  • 是的,如果仅用于验证,我同意这一点。但是,对于条件格式代码,我看不出有太多其他方法可以保留在 DataGridView 的相关代码中(或在派生自 DataGridView 的类中对其进行抽象)。

标签: c# .net winforms datagridview


【解决方案1】:

我目前在带有自定义验证的网格上使用 CellValueChanged,并且在显示或其他任何方面都没有问题。

我使用此事件是因为我想触发特定顺序的事件,但仅限于用户更改单元格的值时。

我没有注意到性能下降的方式(用 100 - 5000 行测试)。

我认为这最终取决于您的验证需求是什么。就我而言,CellValueChanged 完成了我想要/需要的工作。

编辑

CellValidating 事件最大的好处是,如果输入的值未通过验证,您可以阻止用户离开单元格。我不想这样做。

【讨论】:

  • 谢谢,关于 CellValidating 允许阻止用户离开单元格的好点。在我当前的项目中不是我需要的东西,但我想我不记得这个区别了。
  • 如果未通过验证,我不想阻止用户离开单元格。你能给我一个你的 CellValueChanged 函数的例子吗?现在我正在使用 CellValidating、CellValidated 和 CellEndEdit。但我认为你的方法是最好的。如果您能提供示例,那将有很大帮助。
  • “CellValidating 事件是您可以阻止用户离开单元格”,这也阻止了用户关闭表单。不好的做法,但在特定情况下很有用。
【解决方案2】:

很简单,在 CellValidatingEvent 中,您需要检查条件是否正确。如果您的条件为假,那么您只需添加此代码e.cancel。它将防止光标失去焦点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2012-11-29
    • 2016-07-17
    • 2019-01-26
    相关资源
    最近更新 更多