是否等效于DateTimePicker上的SelectionChangeCommitted?

时间:2019-01-10 18:38:13

标签: vb.net winforms datetimepicker

我有一些功能只有在加载窗体后才需要激活。
我在使用ComboBoxes时遇到了这个问题,并使用 SelectionChangeCommitted 而不是 SelectedValueChanged 解决了此问题,因为仅当用户是用户时才触发第一个进行更改。

DateTimepicker.ValueChanged是否有任何等效事件(因为像Select.SelectedValueChanged这样的事件在设置所有内容之前就被触发了?)

1 个答案:

答案 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