【问题标题】:TextBox Validation in VB.NET and Windows FormsVB.NET 和 Windows 窗体中的文本框验证
【发布时间】:2009-03-05 12:02:33
【问题描述】:

我正在使用以下代码来验证用户输入的文本。它工作得很好。但是我想添加退格功能,以便用户删除错误输入的数字。

我尝试了几件事,但它们有效,但在最后一个数字之前(小数点后),即在数字完全输入后它不允许删除。 数字输入格式为:12313213.45

我该怎么办?

Private Sub TextBox5_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox5.KeyPress

    'validation '
    Dim KeyAscii As Short = Asc(e.KeyChar)
    If Not ((KeyAscii >= System.Windows.Forms.Keys.D0 And KeyAscii <= System.Windows.Forms.Keys.D9) Or (KeyAscii = System.Windows.Forms.Keys.Back) Or Chr(KeyAscii) = "." Or (Chr(KeyAscii) Like "[ ]")) Then
        KeyAscii = 0
        TextBox5.Focus()
    End If
    If KeyAscii = 0 Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") >= 0 And e.KeyChar = "." Then
        e.Handled = True
    End If

    If TextBox5.Text.IndexOf(".") > 0 Then
        If TextBox5.SelectionStart > TextBox5.Text.IndexOf(".") Then
            If TextBox5.Text.Length - TextBox5.Text.IndexOf(".") = 3 Then
                e.Handled = True
            End If
        End If
    End If
End Sub

【问题讨论】:

  • 我没有足够的代表来编辑帖子,但是请有人将评论标记改回原来正确的 VB 评论。 (//验证应该是'验证)
  • pipTheGeek:我已经对帖子进行了教育,但我不得不在末尾添加第二个撇号,否则荧光笔会将整个 sn-p 视为单个字符串

标签: vb.net winforms textbox


【解决方案1】:

有一种更简单的方法可以验证这一点。尝试将编辑框中的文本转换为浮点数。如果捕捉到异常,则该数字无效。

试图通过击键来验证击键会让你很头疼。

【讨论】:

  • 使用异常来执行任务是否明智?
  • 不,这就是你使用Decimal.TryParse 的原因。
【解决方案2】:

更好的方法是使用支持小数的控件(如果您使用的是 infragistics、componentone、devexpress 等)。用户可以获得视觉提示并可以做一些简洁的事情,例如单击箭头前进数字。

如果您使用的是普通的老式 winform,请查看蒙版编辑控件。

就我个人而言,当应用程序试图纠正我并且我还没有完成输入数据时,我发现它非常很烦人。让用户完成然后在有任何问题时通知他们对用户来说更加友好。

【讨论】:

  • 实际上,股票NumericUpDown WinForms 控件可以处理小数部分——但它需要您指定要显示的小数位数,并且不允许用户输入更多。
【解决方案3】:
txtMobil.Text = Format(txtMobil.Text, "###-###-####")

【讨论】:

    【解决方案4】:

    不要尝试一次验证一个击键。
    1) 您刚刚发现退格需要更多代码,现在添加对剪切/复制和粘贴的支持,并且删除键和键入替换选择。代码不好。
    2)它只会让用户感到困惑。或者更糟糕的是,他们尝试输入 a 。将日期分隔到您的字段中,您可以通过忽略第二个来将该日期强制转换为合法数字。他们现在输入了完全错误的内容,您的程序不会告诉他们。
    文本框的验证事件是这种逻辑应该去的地方。它会在焦点移动到另一个控件时触发(其 CausesValidation 属性为 true,这允许即使当前控件未处于有效状态也可以单击取消按钮)。
    在验证事件中,您可以进行所有需要的检查,如果数据无效则取消该事件,以及显示您需要的任何消息。为了验证我建议从 Single.TryParse 开始的值,如果转换成功,您可以继续进行所需的任何范围检查。 TryParse 比@Bork 的建议更好,因为它更易于阅读,并且避免了抛出/捕获不必要的异常。

    编辑:刚刚注意到您还限制了输入文本的长度。您可以通过设置 TextBox 的 MaxLength 属性来做到这一点。

    【讨论】:

      【解决方案5】:

      我认为下面的链接应该可以准确地为您提供所需的内容:

      Numeric TextBox

      虽然它需要相当多的代码来处理每次按键的验证,但这当然是可能的,而且上面的代码似乎处理了删除、退格、复制/粘贴等。

      【讨论】:

        【解决方案6】:

        或者使用正则表达式来处理困难的事情

        【讨论】:

          【解决方案7】:

          是的,或者只是让嵌套的 if...then 块看起来像这样:

          If Textbox5.Text.IndexOf(".") > 0 Then
              If Textbox5.SelectionStart > Textbox5.Text.IndexOf(".") Then
                  If Textbox5.Text.Length - Textbox5.Text.IndexOf(".") = 3 Then
                      If KeyAscii <> System.Windows.Forms.Keys.Back Then e.Handled = True
                  End If
              End If
          End If
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-11
            • 1970-01-01
            • 2011-08-24
            • 2011-08-24
            • 1970-01-01
            • 2012-01-19
            相关资源
            最近更新 更多