vb.net: datetimerpicker поменяет изменение значения пожаров - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть следующий код vb.net:

Public Class TEMP
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'myDate.MinDate = Today.AddDays(1)
    myDate.Value = Today.AddDays(1)
End Sub

Private Sub HCheckOutDate_ValueChanged(sender As Object, e As EventArgs) Handles myDate.ValueChanged
    MsgBox(myDate.Value)
End Sub
End Class

В этом коде «myDate» является элементом GUI DateTimePicker.

Если я запускаю код, подобный этому (обратите внимание, что одна строка закомментирована), тогда все работает как положено: как только я нажимаю на DateTimePicker, появляется селектор даты, я выбираю новую дату, и событие ValueChange получаеттак что я вижу сообщение с выбранной датой.Если я снова выберу новую дату, то снова произойдет то же самое.

Однако!Если я раскомментирую строку, которая устанавливает свойство mindate, тогда при выборе новой даты первый раз работает, как описано выше, но как только я хочу выбрать новую дату снова, происходит следующее:

  1. До появления селектора датыдата возвращается к виду, и событие valueChange запускается
  2. Еще до того, как появится селектор даты, дата возвращается к своему первоначальному значению, а событие valueChange запускается снова
  3. Теперь селектор датыПоявляется, я могу выбрать новую дату, и если я это сделаю, то событие valueChnage будет запущено снова

Таким образом, практически, если заданное значение установлено, то я вижу событие, инициируемое три раза, что вообще не имеет смысла.

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Итак, решение, которое я нашел, на самом деле не решение, а обходной путь.Кажется, что DateTimePicker просто не работает правильно, если свойство minDate установлено в будущее, например: myDate.minDate= today.addDays(1) в моем случае.

Примечание1: проблема НЕ возникает, если для Mateate установлено значение сегодня или даже myDate.minDate = today.addDays(-1) работает отлично.Кажется, у него есть проблемы с будущим «только».

Примечание2: в новом коде я временно отключаю событие valueChange.Один раз, когда форма загружается, поэтому инициализация объекта не запускает событие, и один раз, когда событие запускается, потому что пользователь изменил дату.Пользователь может выбрать текущую дату (сегодня), но на самом деле первая дата, которую мы должны применить, это завтра, поэтому значение datetimepicker может снова измениться.Отключение события означает, что событие срабатывает только один раз.

Как я уже сказал, это действительно только обходной путь.Я не знаю, как это возможно, что средство выбора даты не может обработать такую ​​простую вещь, как myDate.minDate = today.addDays(1)

Public Class TEMP
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        RemoveHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
        myDate.MinDate = Today
        AddHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
    End Sub


    Private Sub myDate_ValueChanged(sender As Object, e As EventArgs) Handles myDate.ValueChanged

        If myDate.Value.Date = Today.Date Then
            RemoveHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
            myDate.Value = Today.AddDays(1)
            AddHandler myDate.ValueChanged, AddressOf myDate_ValueChanged
        End If

        MsgBox(myDate.Value)
    End Sub
End Class
0 голосов
/ 25 сентября 2018

Я немного его протестировал, и похоже, что он немного прослушивается.Если я изменил месяц, он без всякой причины перешел в бесконечный цикл событий.

Я предложил решение , и оно может помочь вам:

Мы должны изменить событие для обработки, с .ValueChanged на .TextChanged.Поведение программы будет таким же, как и у пользователя, но теперь оно не будет запускаться без причины.

В общем:

Private Sub HCheckOutDate_TextChanged(sender As Object, e As EventArgs)
    MsgBox(myDate.Value)
End Sub

Примечания:

Используйте myDate.Value = Today вместо Today.AddDays(1).

Today.AddDays(1) означает, что ваша минимальная дата будет завтра (сегодня + 1), и ядумаю, что, возможно, именно поэтому его поведение очень странное.


Замечания 2:

Просто чтобы быть уверенным, что все работает нормальноудалите обработчик в форме события загрузки, как показано ниже:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    RemoveHandler myDate.TextChanged, addressOf HCheckOutDate_TextChanged
    myDate.MinDate = Today.addDays(1)
    'myDate.Value = Today.addDays(1) this is a repetition. MinDate will do the same thing
    AddHandler myDate.TextChanged, addressOf HCheckOutDate_TextChanged
End Sub

Затем вы можете добавить его после объявления MinValue, просто чтобы быть уверенным, что в этих строках ничего не сработает

...