【问题标题】:VB.NET Event handler code inside the custom class runs first before the object itself event handler codeVB.NET 自定义类中的事件处理程序代码在对象本身的事件处理程序代码之前首先运行
【发布时间】:2012-07-27 09:50:44
【问题描述】:

我创建了自己的类 c_DataGridView,继承自 DataGridView。现在在这个类中我已经实现了事件CellEndEdit

现在我在名为 myGrid1 的表单上创建了此类/控件的实例,然后我还在表单上实现了相同的网格事件。

现在,当我运行表单并编辑 Grid 上的单元格时,事件触发顺序是:首先触发我的类 c_DataGridView 的 CellEndEdit 事件,然后触发在表单上实现的对象事件。

有没有可能我可以设法先触发 c_DataGridView 对象的事件,然后再触发类的事件本身。

我希望我已经清除了自己。

【问题讨论】:

  • 您的问题似乎与事件和事件处理程序有些混淆。如果我明白您的意思,那么在表单上使用 BeforeCellEndEdit 可能会更好。您想要做的问题是您可能使您的组件依赖于表单,这是低音确认
  • 我在自定义类中合并了数组,当 CellEndEdit 事件触发时,它会更新单元格中的数组值。没关系。但是,当我尝试根据“百分比”列下的另一个单元格操作和更新一个单元格的值时,比如一个名为“金额”的列,我必须在表单上执行此操作。我现在想要的是首先计算出这个计算(表单上的事件处理程序),然后应该触发类的事件处理程序。

标签: vb.net class events triggers


【解决方案1】:

事件处理程序的触发顺序是不可预测的。有一个标准模式来处理这个问题,.NET 类总是有一个与事件同名的受保护方法,前缀为“On”。

因此,在您的派生类中,重写 OnCellEndEdit() 方法而不是订阅事件。您现在可以完全控制事件的处理和触发方式。您可以先调用 base.OnCellEndEdit(),然后编写您的自定义代码。或者您可以最后调用它,首先编写您的自定义代码。或者您不能调用它,以防止 CellEndEdit 事件被触发。显然,您现在可以完全控制订单,正确的方式取决于您要完成的任务。

【讨论】:

  • 优秀。它完全按照我的要求完成了这项工作。 (我还在方法 OnCellValueChanged 而不是 OnCellEndEdit 下转移了我的代码)。另外请告诉我,在 MSDN 文档中哪里可以找到这个解释?
【解决方案2】:

根据您的 cmets,我会采取不同的方式。

匹配一行的类。 与行列表匹配的类,具有 BindingList 属性。 然后我会把它绑定到网格上。 然后,当在行类中更改百分比时,更新 Amount 属性。这将触发属性更改事件,从而导致网格更新。

所以基本上尝试在几个类中获取所有数据逻辑,而不是在表示层的内部事件处理程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2021-06-04
    相关资源
    最近更新 更多