Это довольно распространенная ситуация.
Когда после первой инициализации формы значение элемента управления изменяется, соответствующее (ые) событие (а) возбуждается для уведомления об изменении подписчиков.
Событие 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