Страница: 1 | 2 |
Вопрос: Странное поведение DateTimePicker в VB 2008
Добавлено: 23.09.09 10:31
Автор вопроса: mrDenic
Не могу понять, почему мой код в VB 2008 дважды вызывает
Msgbox при выполнении условия. При этом в VBA(Excel)всё работает нормально.
код на VB 2008-Msgbox,( т.е. условие) выполняеться дважды
Public FirstRec As Date 'заданная дата,раньше которой пользователю не разрешено выбирать значение из календаря(берёться из базы)
Private Sub DateTimePicker1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DateTimePicker1.TextChanged
If (DateTimePicker1.Value < FirstRec Or DateTimePicker1.Value > Now()) Then
MsgBox("Данные за указанный период отсутствуют!!!" & Chr(13) & "Первая запись: " & FirstRec, vbInformation)
DateTimePicker1.Value = Now()
End If
End Sub
код на VBA-работает как надо
Public FirstRec As Date 'заданная дата,раньше которой пользователю не разрешено выбирать значение из календаря(берёться из базы)
Private Sub DTPicker1_Change()
If (DTPicker1.Value < FirstRec Or DTPicker1.Value > Now()) Then
MsgBox "Данные за указанный период отсутствуют!!!" & Chr(13) & "Первая запись: " & FirstRec, vbInformation
DTPicker1.Value = Now()
End If
End Sub
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #1
Добавлено: 23.09.09 14:01
Я так полагаю, потому что после вызова
DateTimePicker1.Value = Now()
снова происходит событие DateTimePicker1_TextChanged
Номер ответа: 2
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #2
Добавлено: 23.09.09 14:54
То что строчка
DateTimePicker1.Value = Now()
ещё раз вызывает событие "ateTimePicker1_TextChanged"-это совершенно верно, но ведь условие не выполняеться, т.к FirstRec берёться из базы и оно заведомо старше текущей даты(разница между датами порядка двух недель).
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 23.09.09 15:01
Ну посмотри в пошаговом выполнении в каком именно месте не так работает
Номер ответа: 4
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #4
Добавлено: 23.09.09 15:07
перво наперво это и сделал
DateTimePicker1.Value = Now() отрабатывает нормально, потом после закрытия процедуры в самом календарике дата перекидываеться на ту, которую в форме выбрал рукамми, процедура происходит ещё раз и потом всё нормально
Номер ответа: 5
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #5
Добавлено: 23.09.09 15:14
могу выложить архив, только незнаю куда удобнее.
Номер ответа: 6
Автор ответа:
Дмитрий Юпатов
Вопросов: 4
Ответов: 457
Web-сайт:
Профиль | | #6
Добавлено: 23.09.09 15:41
хитро...
При пошаговой прогонке видно, что если мы выбираем неподходящую дату, то происходит так:
выполняется условие, отображается сообщение, затем изменяется текст. Изменение текста вызывает еще один проход процедуры. Тут все хорошо и логично, НО!
При повторном выполнении текст(свойство контрола) почему-то снова становится первоначальным... Ну и второй месидж получаем...
Чето мягкотелые напортачили...
Номер ответа: 7
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #7
Добавлено: 23.09.09 15:50
Совершенно верно, потому и назвал "Странное поведение DateTimePicker в VB 2008". Парни не поверите, третий день бьюсь с этой ерундой, такая мелочь и столько времени убил!!!
Номер ответа: 8
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #8
Добавлено: 23.09.09 17:08
вы помойму сами себе проблемы создаете, что мешает установить свойства MinDate = FirstRec и MaxDate = Now() у DateTimePicker и нифига больше не проверять?
Номер ответа: 9
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #9
Добавлено: 23.09.09 17:59
Разница между FirstRec и Now()составляет 14-17 дней, т.е. даже месяца не составляет.
Номер ответа: 10
Автор ответа:
Skywalker
ICQ: 300-70-6пятьЪ
Вопросов: 62
Ответов: 545
Web-сайт:
Профиль | | #10
Добавлено: 23.09.09 18:03
ну и что? да, календарь будет показывать весь месяц, но на даты, не входящие в заданный промежуток, нельзя будет ткнуть
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 23.09.09 21:31
имхо, работать с датой в TextChanged есть кривое решение.. я бы рекомендовал более тщательно изучить события этого контрола, и порядок их следования..
Номер ответа: 12
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #12
Добавлено: 24.09.09 09:03
Skywalker
Да, возможно такое решение. Правда есть загвоздка, программа на VBA(Excel) работает уже несколько лет, а сейчас переноситься на VB, по этому не хотелось бы изменять HMI, чтоб юзвери не вопели.
Возможно правильнее было-бы использовать ValueChanged, но мне нужно это событие только для проверки валидности заданной даты, да и в хелпе написано, что события Change в VB 2008 нет, но наиболее соответствует ему событие TextChanged.
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 24.09.09 13:45
именно так... это было бы самым верным..
а для этого есть события Validating, Validated.. Они то как раз и предназначены для выполнения разного рода проверок..
Повторю еще раз.. надо внимательней изучать свойства и события контрола с которым работаешь..
Номер ответа: 14
Автор ответа:
mrDenic
Вопросов: 1
Ответов: 9
Профиль | | #14
Добавлено: 25.09.09 12:46
Спасибо всем за советы, задача решена. Только вот всё же не понятно почему при повторном выполнении текст контрола становился первоночальным
Номер ответа: 15
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #15
Добавлено: 25.09.09 15:43
Не задавай неудобных вопросов, смущаешь