我希望将许多处理程序设置为我的一个方法的地址。例如,一旦设置了所有处理程序,它将与编写以下代码相同:
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
变量用于我的listview项目已更改。如果它是真的,我不需要保存任何东西,因为它已经保存了。如果它是假的,则进行了修改,我应该提示用户在更改项目之前保存他的信息。
正如您所看到的,我有许多控件,在修改的情况下由各自的事件处理。这使我能够通知我的用户是否在表单中修改了一个项目。
唯一的问题是,当用户更改列表视图中的项目时,所有这些事件都会被触发,因为文本框,组合框等会被信息输入。因此,我会相应地添加和删除我的处理程序。
不幸的是,我不想为每个要处理的控件添加一行,例如:
AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade
我的问题是,将多个处理程序添加到1个地址目的地的最简单方法是什么?
答案 0 :(得分:2)
您必须为每个控件添加一行:
AddHandler Analyse_tbCurrentDescription.TextChanged, AddressOf ModificationsMade
或者遍历你的控件(如果你找到一个标准将它们组合成一个循环,比如一个普通的父项),并在循环中执行相同的行。
但是,您应该做的是将业务逻辑层与UI分离。那你没有这个问题。
编辑:关于您的更新,如果您的业务逻辑对象是DataRow,它有版本,因此您可以将当前版本与旧版本进行比较。在用户更改A - >的情况下,使用RowState
可能不合适B然后B - >答:在这样的示例中,您确实不应该注册更改,尽管RowState
最终会成为Modified
。使用Analyse_Saved = False
将始终注册更改,类似于RowState
方法。
答案 1 :(得分:1)
一个简单的替代解决方案可以声明2个函数。 一个函数将处理程序添加到每个控件(即AddHandlers())。 另一个函数从每个控件中删除处理程序(即RemoveHandlers())
所以你只需要调用RemoveHandlers(),做你的事情,然后再调用AddHandlers()。
答案 2 :(得分:1)
唯一的问题是,当用户更改列表视图中的项目时,全部 这些事件是由文本框,组合框等触发的 获取信息。因此,我会添加和 相应地删除我的处理程序。
这个问题,以及防止表单加载等触发事件的相关问题我通常使用一个名为EventsArmed的布尔值来处理,当我希望事件发生时,它只被设置为true;然后检查该布尔值(如果EventsArmed然后...)作为'form is dirty'代码的一部分。