0

我希望将许多处理程序设置为我的一种方法的地址。例如,一旦设置了我的所有处理程序,它就与编写以下代码相同:

Private Sub ModificationsMade(sender As Object, e As System.EventArgs) Handles Analyse_tbCurrentDescription.TextChanged, Analyse_tbNewDescription.TextChanged, Analyse_tbTimeTests.TextChanged, Analyse_tbTimeInstallation.TextChanged, Analyse_tbTimeMaintenance.TextChanged, Analyse_nupCurrentAmount.ValueChanged, Analyse_nupNewAmount.ValueChanged, Analyse_cbCurrentTime.SelectedIndexChanged, Analyse_cbCurrentOccurence.SelectedIndexChanged, Analyse_cbNewTime.SelectedIndexChanged, Analyse_cbProgrammer.SelectedIndexChanged, Analyse_dgvTasks.CellValueChanged
    Analyse_Saved = False
End Sub

我的Analyse_Saved变量在我的列表视图项目中使用已更改。如果这是真的,那么我不需要保存任何东西,因为它已经被保存了。如果它是错误的,则进行了修改,我应该在用户更改项目之前提示用户保存他的信息。

如您所见,我有许多控件,在修改的情况下由它们各自的事件处理。如果表单中的项目已被修改,这使我能够通知我的用户。

唯一的问题是,当用户更改列表视图中的项目时,所有这些事件都会被触发,因为文本框、组合框等都被输入了信息。因此,我会相应地添加和删除我的处理程序。

不幸的是,我不想为每个要处理的控件添加一行,例如:

AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade

我的问题是,将多个处理程序添加到 1 个地址目标的最简单方法是什么?

4

3 回答 3

2

您要么必须为每个控件添加一行:

AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade

或者循环遍历您的控件(如果您找到将它们分组为循环的条件,例如共同的父级),并在循环中执行同一行。

但是,您应该做的是将业务逻辑层与 UI 分离。那你就不存在这个问题了。

编辑:关于您的更新,如果您的业务逻辑对象是 DataRow,它有版本,因此您可以将当前版本与旧版本进行比较。在用户更改 A -> B 然后 B -> A 的情况下使用RowState可能不合适。在这样的示例中,您实际上不应该注册更改,尽管RowState最终会是Modified. 使用Analyse_Saved = False将始终注册更改,类似于RowState方法。

于 2013-05-31T14:43:09.657 回答
1

一个简单的替代解决方案可以声明 2 个函数。一个函数将处理程序添加到每个控件(即 AddHandlers())。另一个函数从每个控件中删除处理程序(即 RemoveHandlers())

所以你只需要调用 RemoveHandlers(),做你的事情,然后 AddHandlers()。

于 2013-05-31T14:42:55.460 回答
1

唯一的问题是,当用户更改列表视图中的项目时,所有这些事件都会被触发,因为文本框、组合框等都被输入了信息。因此,我会相应地添加和删除我的处理程序。

这个问题,以及防止在表单加载时触发事件等相关问题,我通常由一个名为例如 EventsArmed 的布尔值处理,它仅在我希望事件执行某些操作时设置为 true;然后检查该布尔值(如果 EventsArmed 然后......)作为“表单脏”代码的一部分。

于 2013-05-31T15:47:53.820 回答