4

我的要求是用户将在屏蔽文本框中输入时间(“HH:mm:ss”),并根据该时间我正在做一些功能。我的问题是我可以屏蔽时间,但我不能限制用户最多输入 23 小时、59 分钟和 59 秒。如何解决这个问题。

C# 代码

private void Form1_Load(object sender, EventArgs e)
 {
    maskTxtAlert1.Mask = "00:00:00";
        maskTxtAlert1.CutCopyMaskFormat = MaskFormat.ExcludePromptAndLiterals;
 }

 private void maskTxtAlert1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
 {
            if (e.Position == maskTxtAlert1.Mask.Length)
           {
               string errorMessage = "You cannot add extra characters";
               toolTip1.ToolTipTitle = "Input Rejected - No more inputs allowed";
               toolTip1.Show(errorMessage, maskTxtAlert1, 12, 24, 2000);
               errorProvider1.BlinkStyle = ErrorBlinkStyle.AlwaysBlink;
               errorProvider1.SetError(maskTxtAlert1, errorMessage);
           }
           else
           {
               toolTip1.ToolTipTitle = "Input Rejected";
               string errorMessage = "You can only add numeric characters (0-9).";
               toolTip1.Show(errorMessage, maskTxtAlert1, 12, 24, 2000);
               errorProvider1.BlinkStyle = ErrorBlinkStyle.AlwaysBlink;
               errorProvider1.SetError(maskTxtAlert1, errorMessage);
           }
   }

 private void maskTxtAlert1_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
 {
           MessageBox.Show("Enter Valid as One");
 }
4

4 回答 4

4

我认为最好使用 tezzo 所说的 DateTimePicker 并且不需要验证

dateTimePicker1.Format = DateTimePickerFormat.Custom;
//For 24 H format
dateTimePicker1.CustomFormat = "HH:mm:ss";
//For 12 H format
dateTimePicker1.CustomFormat = "hh:mm:ss tt";
dateTimePicker1.ShowUpDown = true; 
于 2013-07-10T08:16:17.870 回答
1

使用DateTimePickerFormatwith.CustomFormat = "HH:mm:ss"可能是最好的开箱即用方法,但在 UI 交互方面可能会受到限制。

对于来这里寻找添加验证的人来说MaskedTextBox,有几个不错的选择。

类型验证

如果你仍然想要自动解析,你可以像这样添加一个ValidatingType并点击TypeValidationCompleted事件:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        MaskedTextBox1.Mask = "00:00"
        MaskedTextBox1.ValidatingType = GetType(DateTime)
End Sub

Private Sub MaskedTextBox1_TypeValidationCompleted(sender As Object, e As TypeValidationEventArgs) _
    Handles MaskedTextBox1.TypeValidationCompleted
    If Not e.IsValidInput Then
        Me.validationToolTip.ToolTipTitle = "Invalid Time"
        Me.validationToolTip.Show("The time you supplied must be a valid time in the format HH:mm", sender)
    End If
End Sub

ValidatingType将利用public static Object Parse(string)它传递的每种类型的方法。你甚至可以传入你自己的自定义类,只要它们实现了这个签名

自定义验证:

要提供您自己的自定义验证,您可以Validating像这样点击事件:

Private Sub MaskedTextBox1_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) _
    Handles MaskedTextBox1.Validating
    Dim senderAsMask = DirectCast(sender, MaskedTextBox)
    Dim value = senderAsMask.Text
    Dim parsable = Date.TryParse(value, New Date)

    If Not parsable Then
        e.Cancel = True
        Me.validationToolTip.ToolTipTitle = "Invalid Time"
        Me.validationToolTip.Show("The time you supplied must be a valid time in the format HH:mm", sender)
    End If
End Sub

在这种情况下,验证实现仍然相当幼稚,但您可以实现任何想要确定有效性的逻辑。

注意
如果该CausesValidation属性设置为false,则ValidatingValidated事件将被抑制。
如果Validating 事件委托中的Cancel属性CancelEventArgs设置为trueValidating ,则通常在事件之后发生的所有事件都将被抑制。

对于奖励积分,当用户再次开始输入时隐藏工具提示:

Private Sub MaskedTextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) _
    Handles MaskedTextBox1.KeyDown
    Me.validationToolTip.Hide(sender)
End Sub
于 2016-06-03T13:38:58.347 回答
0

如果您不必maskedTextBox像 tezzo 所说的那样使用,但这可能不太方便。我会选择一种更简单的方法:您可以更改无效的用户值messageBox,而不是弹出一个。TypeValidationCompleted例如,如果用户在小时内写入的值高于 23,则将其更改为 23

于 2013-07-10T08:13:04.973 回答
0

MaskedTextbox 类不是为处理这种类型的验证而构建的,您必须向 Validation Complete 事件添加一些手动验证。

例如

string[] timedetails = FormattedDate.Split(':');
int hours = Int32.Parse(timedetails[0].Trim());
int minutes = Int32.Parse(timedetails[1].Trim());
int seconds = Int32.Parse(timedetails[2].Trim());

if(hours > 23)
{
   //error message here, etc.
}

但是,使用可能设置为长时间格式的格式化 DateTime 控件可能会好得多。请参阅MSDN 上的完整格式列表

于 2013-07-10T08:14:27.223 回答