Kyle_Forward Ответов: 3

Запретите пользователям выбирать время вне рабочего времени


У меня есть приложение, в котором пользователи могут планировать обслуживание. Я смог ограничить выбор только будними днями, но у меня возникли проблемы с ограничением выбора времени?
Я пытаюсь сохранить окно обслуживания между 8а-4Р по местному времени.

Что я уже пробовал:

Private Sub DateTimePick_CloseUp(ByVal sender As Object, ByVal e As System.EventArgs) Handles DateTimePick.ValueChanged
    If (DateTimePick.Value.DayOfWeek = DayOfWeek.Saturday) Or (DateTimePick.Value.DayOfWeek = DayOfWeek.Sunday) Then

        'Now just add the right amount of days to make it Monday
        Select Case DateTimePick.Value.DayOfWeek
            Case DayOfWeek.Saturday
                DateTimePick.Value = DateTimePick.Value.AddDays(2)
            Case DayOfWeek.Sunday
                DateTimePick.Value = DateTimePick.Value.AddDays(1)
        End Select

        MsgBox("We're sorry, we are not currently scheduling maintenance for Saturday or Sunday. The following Monday, " &
               DateTimePick.Value.ToShortDateString & ", has been selected.",
               MsgBoxStyle.Exclamation, "Invalid selection")
    End If
End Sub

Maciej Los

И вы хотите ограничить время в том же контроле?

Kyle_Forward

Правильный. Пользователи должны иметь возможность планировать только "M-F - 8a-4p"

Richard MacCutchan

Проверьте правильность дня, а затем проверьте, что время начинается после 8 и заканчивается до 4. В чем же проблема?

3 Ответов

Рейтинг:
2

Maciej Los

Kyle_Forward написал:
..Пользователи должны иметь возможность планировать только "M-F - 8a-4p"


Итак, я бы предложил создать BusinessDay класс:

Public Class BusinessDay
	
	Private dt As DateTime = DateTime.Now
	
	Public Sub New(initialDate As DateTime)
		Init(initialDate)
	End Sub
	
	Private Sub Init(selectedDT As DateTime)
		dt = selectedDT
		Dim daysToAdd As Integer = If(dt.DayOfWeek = DayOfWeek.Saturday, 2, If(dt.DayOfWeek = DayOfWeek.Sunday, 1, 0))
		dt = dt.AddDays(daysToAdd) 'saturday/sunday => monday
		Dim minDate As DateTime  = dt.AddHours(-dt.Hour+8).AddMinutes(-dt.Minute) 'selected date - 8:00 AM
		Dim maxDate As DateTime  = minDate.AddHours(8) 'selected date - 4:00 PM
		
		If dt> maxDate Or dt<minDate
			Throw New Exception($"Selected date {dt.ToString("yyyy-MM-dd HH:mm")} is out out working hours (8AM - 4PM)!")
		End If

	End Sub
	
	Public Overrides Function ToString() As String
		Return dt.ToString("yyyy-MM-dd HH:mm")
	End Function

End Class


Использование:
Dim selectedDT As DateTime  = DateTimePick.Value
Dim bd As BusinessDay

Try
    bd = New BusinessDay(selectedDT)
Catch Ex As Exception
    MessageBox.Show(Ex.Message)
End Try
'bd is out of working hours - exit sub!
If bd Is Nothing Then
    Exit Sub
End If
'everything is OK, so you can proceed


Patrice T

+5

Maciej Los

Большое спасибо!

Рейтинг:
2

Patrice T

Цитата:
Запретите пользователям выбирать время вне рабочего времени

Хорошее начало, но ваш дизайн испорчен, вы забыли справиться с праздниками (так как дни закрыты в неделю).
День Независимости-4 июля, и он закрыт, независимо от дня недели. Итак, добавление теста для даты-это хорошая идея.
И дата пасхального дня меняется каждый год, где-то, вы должны быть в состоянии перечислить эти дни.


Maciej Los

Хорошая мысль!

Patrice T

И тебе спасибо

Рейтинг:
0

Ralf Meier

В дополнение к решению от Мацея, а также решению (предложению) от Патриса я, возможно, пошел бы этим путем :
- Создайте свой собственный myDateTimePicker, который наследует DateTimePicker.
- Добавьте свойства для ограничений, которые вы хотите иметь
- Возможно, изменить или настроить дизайн
- Переопределите OnValueChanged-метод для выполнения ограничения и реакции внутри (нового) элемента управления - возможно, с помощью кода, предложенного Maciej

Вам нужен образец кода для этого ?