Установите TextBox, который принимает только диапазон времени - PullRequest
0 голосов
/ 23 марта 2019

Мне нужно вставить в текстовое поле интервалы времени в формате hh:mm/hh:mm (например, 08:00/13:00, 14:00/18:00), чтобы установить время приема конкретного пользователя.

Как я могу сделать это, также введя элемент управления для введенного времени (если я введу 25:60/70:90, он не должен быть принят, потому что расписание не существует). Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 23 марта 2019

Другой вариант - использовать TimeSpan.TryParseExact.Это даст вам тот же результат, а также позволит вам легко получить значения времени как TimeSpan с, чтобы вы могли использовать их для дальнейших вычислений или для их хранения где-нибудь, например.

Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    Dim validRange As Boolean = False
    Dim time1, time2 As TimeSpan

    Dim timeRanges As String() = TextBox1.Text.Split("/"c)
    If timeRanges.Length = 2 Then
        If TimeSpan.TryParseExact(timeRanges(0), "hh\:mm",
                                  Globalization.CultureInfo.InvariantCulture, time1) AndAlso
           TimeSpan.TryParseExact(timeRanges(1), "hh\:mm",
                                  Globalization.CultureInfo.InvariantCulture, time2) Then
            validRange = True
        End If
    End If

    If validRange Then
        ' Use `time` and `time2` for anything you want.
    Else
        ' TODO: Indicate to the user that they entered an invalid input.
        e.Cancel = True
    End If
End Sub

Редактировать:

Если вы не хотите вводить вручную : и /, вы можете использовать MaskedTextBox вместо TextBox.

Сначала, после добавления MaskedTextBox на форму, установите для его свойства Mask значение 00:00/00:00:

MaskedTextBox.Mask

Затем вы можете настроить приведенный выше кодработать с MaskedTextBox следующим образом:

Private Sub MaskedTextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MaskedTextBox1.Validating
    Dim validRange As Boolean = False
    Dim time1, time2 As TimeSpan

    Dim timeRanges As String() = MaskedTextBox1.Text.Split("/"c)
    If MaskedTextBox1.MaskCompleted Then
        If TimeSpan.TryParseExact(timeRanges(0), "hh\:mm",
                                  Globalization.CultureInfo.InvariantCulture, time1) AndAlso
           TimeSpan.TryParseExact(timeRanges(1), "hh\:mm",
                                  Globalization.CultureInfo.InvariantCulture, time2) Then
            validRange = True
        End If
    End If

    If validRange Then
        ' Use `time` and `time2` for anything you want.
    Else
        ' TODO: Indicate to the user that they entered an invalid input.
        e.Cancel = True
    End If
End Sub
0 голосов
/ 23 марта 2019

Вот пример, который вернет List(Of TimeSpan), если в указанном вами формате найдены четыре действительных значения времени.Это немного неуклюже, по замыслу, так что вы можете точно увидеть шаги, предпринятые, чтобы убедиться, что все части действительны.Получив эти четыре раза как TimeSpans, вы можете дополнительно обработать их, чтобы увидеть, имеют ли они смысл вместе как «сдвиг»:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Dim times As List(Of TimeSpan) = ParseShift(TextBox1.Text)
    If times.Count = 4 Then
        Label1.Text = "Valid Times Found"
        ' perform some kind of validation on them?
        For Each ts As TimeSpan In times
            Debug.Print(ts.ToString)
        Next
    Else
        Label1.Text = "Invalid Times and/or Shift Description"
    End If
End Sub

Private Function ParseShift(ByVal input As String) As List(Of TimeSpan)
    Dim values() As String = input.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    If values.Length = 2 Then
        Dim firstHalf() As String = values(0).Split("/".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
        Dim secondHalf() As String = values(1).Split("/".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
        If firstHalf.Length = 2 AndAlso secondHalf.Length = 2 Then
            Dim strTimes As New List(Of String)
            strTimes.AddRange(firstHalf)
            strTimes.AddRange(secondHalf)
            Dim ts As TimeSpan
            Dim times As New List(Of TimeSpan)
            For Each strTime As String In strTimes
                If TimeSpan.TryParseExact(strTime.Trim, "hh\:mm", Globalization.CultureInfo.InvariantCulture, ts) Then
                    times.Add(ts)
                End If
            Next
            If times.Count = 4 Then
                Return times
            End If
        End If
    End If
    Return New List(Of TimeSpan)
End Function
0 голосов
/ 23 марта 2019

Вы можете использовать Регулярные выражения для этой проверки. Вам нужно использовать такой шаблон:

(?:[0-1]\d|2[0-3]):[0-5]\d\/(?:[0-1]\d|2[0-3]):[0-5]\d

Попробуйте онлайн .

Сначала добавьте следующую ссылку:

Imports System.Text.RegularExpressions

Затем, предполагая, что это проект WinForms, вам нужно использовать событие TextBox.Validating, например:

Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    Const pattern As String = "(?:[0-1]\d|2[0-3]):[0-5]\d\/(?:[0-1]\d|2[0-3]):[0-5]\d"

    If Not Regex.IsMatch(TextBox1.Text, pattern) Then
        ' TODO: Indicate to the user that they entered an invalid input.
        e.Cancel = True
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...