我希望将许多处理程序设置为我的一个方法的地址。例如,一旦设置了所有处理程序,它将与编写以下代码相同:
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
我的问题是,向一个地址目的地添加多个处理程序的最简单方法是什么?
您要么必须为每个控件添加一行:
AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade
或者遍历您的控件(如果您找到将它们分组到一个循环中的标准,例如公共父级),并在一个循环中执行相同的行。
但是,您应该做的是将业务逻辑层从UI中分离出来。那你就不会有这个问题了。
EDIT:关于您的更新,如果您的业务逻辑对象是DataRow,则它具有版本,因此您可以将当前版本与旧版本进行比较。在用户更改A -> B,然后更改B -> A的情况下,使用RowState
可能不合适。在这种情况下,您实际上不应该注册更改,尽管RowState
最终将成为Modified
。使用Analyse_Saved = False
将始终注册更改,类似于RowState
方法。
另一个简单的解决方案是声明两个函数。一个函数为每个控件添加处理程序(即AddHandlers())。另一个函数从每个控件中删除处理程序(即RemoveHandlers())
所以你只需要调用RemoveHandlers(),做你的事情,然后AddHandlers()。
唯一的问题是,当用户更改列表视图中的项时,所有的触发这些事件是因为文本框、组合框等然后输入信息。因此,我会加上和删除相应的处理程序。
这个问题,以及相关的防止触发事件的形式加载等,我通常由一个布尔处理,称为EventsArmed,只有当我想要的事件做的东西设置为真;然后检查布尔值(如果eventmed then .)作为"表单是肮脏的"代码的一部分。