Эквивалент SelectionChangeCommitted на DateTimePicker? - PullRequest
0 голосов
/ 10 января 2019

У меня есть некоторые функции, которые должны быть активны только после загрузки формы.
У меня была эта проблема с ComboBox и я решил ее, используя SelectionChangeCommitted вместо SelectedValueChanged, так как первый срабатывает только тогда, когда пользователь вносит изменения.

Есть ли какое-либо эквивалентное событие для DateTimepicker.ValueChanged (поскольку это, например, Select.SelectedValueChanged, запускается до того, как все установлено)?

1 Ответ

0 голосов
/ 11 января 2019

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