DateTimePicker: seleccionar un rango de horas dentro de un solo día
-
22-07-2019 - |
Pregunta
Estoy buscando una manera de usar dos controles DateTimePicker para seleccionar un rango de horas y minutos en un día. Es decir, para seleccionar básicamente un "tiempo de inicio" y un "tiempo de finalización".
Comencé con dos controles DateTimePicker con el formato personalizado de h: mm tt. Intenté agregar (en ValueChanged), una verificación que hizo que el "tiempo de inicio" seleccionado se convierta en el mínimo de "tiempos de finalización" y viceversa, el "tiempo de finalización" se convierta en el máximo de "tiempos de inicio" (lo siento, es difícil de explicar, pero gracias por tu paciencia!)
Sin embargo, ese enfoque no parecía funcionar: todavía podía seleccionar las 11.00 AM en la 'hora de finalización' y la 1.00 PM en la 'hora de inicio'. Tengo la sensación de que el día actual de la marca de tiempo tiene algo que ver con esto (por ejemplo, la hora de inicio es el día anterior y, por lo tanto, es menor).
Pensé en cambiar a un cuadro combinado de intervalos predeterminados de media hora a lo largo del día; sin embargo, los minutos deben ser más flexibles que eso ...
¿Alguna idea?
ACTUALIZACIÓN:
El comentario de Dan a continuación respondió a este problema ... Este es el código con el que terminé como referencia;
Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged
DateTimePicker2.MinDate = Date.Today + DateTimePicker1.Value.TimeOfDay
End Sub
Private Sub DateTimePicker2_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker2.ValueChanged
DateTimePicker1.MaxDate = Date.Today + DateTimePicker2.Value.TimeOfDay
End Sub
DateTimePIcker1 es el límite inferior, DateTImePIcker2 es el límite superior, ambos usan " h: mm tt " como un formato de fecha y hora personalizado.
El almacenamiento de estas preferencias ahora solo usará Value.TimeOfDay (y se almacenará como un intervalo de tiempo), luego, al recuperarlo, se produce el siguiente proceso de carga;
DateTimePicker1.Value = Date.Today + StoredTimeLowerBound
DateTimePicker2.Value = Date.Today + StoredTimeUpperBound
Esto llamará automáticamente a los eventos ValueChanged manejados anteriormente y restaurará los valores seleccionados.
Dan, gracias por tu ayuda :)
Solución
Esto asegurará que sus dos tiempos sean de hoy:
Dim startTime As Date = Date.Today + DateTimePicker1.Value.TimeOfDay
Dim endTime As Date = Date.Today + DateTimePicker2.Value.TimeOfDay
Entonces puedes escribir If endTime < startTime Then endTime = startTime
o lo que quieras.
Por último, simplemente vuelva a colocar los valores de Fecha modificados en los controles DateTimePicker:
DateTimePicker1.Value = startTime
DateTimePicker2.Value = endTime
EDITAR : para un rango de horas, desea un objeto TimeSpan
, que es automáticamente el resultado de la suma / resta de DateTime
objetos:
Dim range As TimeSpan = endTime - startTime
Dim numHours As Double = range.TotalHours