我有一些功能只有在加载窗体后才需要激活。
我在使用ComboBoxes时遇到了这个问题,并使用 SelectionChangeCommitted
而不是 SelectedValueChanged
解决了此问题,因为仅当用户是用户时才触发第一个进行更改。
DateTimepicker.ValueChanged
是否有任何等效事件(因为像Select.SelectedValueChanged
这样的事件在设置所有内容之前就被触发了?)
答案 0 :(得分:1)
这是很常见的情况。
在第一次初始化窗体后,修改控件的值时,将引发关联的事件,以将更改通知订阅者。
ComboBox SelectionChangeCommitted
事件是一个显着的例外:它用于区分用户直接输入和选择中更通用的值更改。
DateTimepicker
控件与大多数其他标准控件一样,没有提供类似的事件。
由于事件处理程序订阅了引发事件时运行的附加代码,因此避免在修改窗体上的控件的值时执行这些例程是常见的问题通过初始化它们的代码。
有多种方法可以管理事件的引发,这些事件可能在错误的时间导致不必要的级联效应。较常见的两个:
在初始化过程之后附加处理程序:
Public Sub New()
InitializeComponent()
InitializeDataStuff()
InitializeEverythingElse()
AttachHandlers()
End Sub
Private Sub Form_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
RemoveHandlers()
End Sub
Protected Sub AttachHandlers()
Addhandler SomeControl.SomeEvent, AddressOf SomeHandlerMethod
Addhandler SomeOtherControl.SomeOtherEvent, AddressOf SomeOtherHandlerMethod
(...)
End Sub
Protected Sub RemoveHandlers()
Removehandler SomeControl.SomeEvent, AddressOf SomeHandlerMethod
Removehandler SomeOtherControl.SomeOtherEvent, AddressOf SomeOtherHandlerMethod
(...)
End Sub
使用布尔字段。使用表格的设计器附加了事件处理程序:
private DontBotherToRunNow As Boolean = True
Public Sub New()
InitializeComponent()
InitializeDataStuff()
InitializeEverythingElse()
DontBotherToRunNow = False
End Sub
Private Sub DateTimePicker_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
If DontBotherToRunNow Then Return
(...)
'Do something
End Sub