Equivalent of SelectionChangeCommitted on DateTimePicker?

Viewed 109

I have some functions that need to be active only after the Form as loaded.
I had this problem with the ComboBoxes and solved it using SelectionChangeCommitted instead of SelectedValueChanged since the first one only is fired when the user is the one making the change.

Is there any equivalent event for the DateTimepicker.ValueChanged (since this one like the Select.SelectedValueChanged is fired before everything is set)?

1 Answers

This is a pretty common situation.
When, after the first initialization of a Form, a Control's value is modified, the associated Event(s) is/are raises, to notify the change to the subscribers.
The ComboBox SelectionChangeCommitted event is a notable exception: it's used to discriminate between a user direct input and a more generic value change in the selection.

The DateTimepicker control, like most of the other standard controls, doesn't provide a similar event.

Since the Event Handlers subscribed to have attached code that is run when an event is raised, it's a common problem to avoid that these routines are executed when the values of the Controls on a Form are modified by the code that initializes them.

There are different methods to manage the raising of events that can cause unwanted cascading effects at the wrong time. Two of the more common:

  • Attach the Event Handlers only after the Controls' initialization is completed, using dedicated methods that are delegated to attach/detach the handlers
  • Make use a boolean Field as a flag to indicate whether the code associated to the Event Handlers should be run when the event is raised.
  • Both

Attach the Handlers after the initialization procedures:

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

Use a Boolean Field. The Event Handlers are attached using the Forms' designer:

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
Related