Winforms TextBox - 仅允许数字或1位小数

时间:2011-11-21 18:45:05

标签: winforms textbox

如何阻止用户输入数字值以及小数点后1位的十进制值以外的任何内容?

应允许用户输入任意长度的字符(如果是十进制值,则在十进制之前)。

3 个答案:

答案 0 :(得分:3)

尝试使用Regex。此模式应该有效:Regex match = new Regex(@"^[1-9]\d*(\.\d{1})?$"),将其放在文本框的验证事件中。如果不匹配,请Undo()或删除Textbox.Text属性。

    Regex match = new Regex(@"^[1-9]\d*(\.\d{1})?$");

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (!match.IsMatch(textBox1.Text))
        {
            textBox1.Undo(); 
        }
    }

要立即实际撤消输入,您必须使用

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (!match.IsMatch(textBox1.Text))
        {
            textBox1.Undo();
        }
    }

因为如果你使用KeyDown,TextBox没有撤消状态。

第二次编辑:如果您希望两种情况匹配,则必须在验证事件或类似事件中进行检查。由于正则表达式使用“$”来确保,最后不添加任何字符,因此无法输入“。”否则你最终会得到一个像1这样的数字,这需要额外的检查。

答案 1 :(得分:0)

对于这一方可能有点晚了,但我扩展了一个简单的文本框以强制输入始终被格式化为十进制..简单但有效

Imports System.Runtime.InteropServices
Imports System.Drawing.Imaging
Imports System.ComponentModel
Imports System.Text.RegularExpressions


<ToolboxBitmap(GetType(System.Windows.Forms.TextBox))> _
Public Class NumericTextBox
    Inherits TextBox

    Dim _TextBoxValue As String
    Dim _CaretPosition As Integer

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        MyBase.OnKeyDown(e)
        _TextBoxValue = Me.Text
        _CaretPosition = Me.SelectionStart
    End Sub
    Protected Overrides Sub OnKeyUp(e As KeyEventArgs)
        MyBase.OnKeyUp(e)

        If (Me.Text.Length = 0) Or (Me.Text = _TextBoxValue) Then Exit Sub
        If IsNumeric(Me.Text) Then

            If Me.Text.EndsWith(".") Then
                Me.Text = Convert.ToDecimal(Me.Text) & "."
            Else
                Me.Text = Convert.ToDecimal(Me.Text)
            End If

        Else
            Me.Text = _TextBoxValue
        End If
        Me.SelectionStart = _CaretPosition + 1
    End Sub
End Class

答案 2 :(得分:-1)

正则表达匹配=新正则表达式(@“^ [1-9] \ d *(。\ d {1})?$”); 正确地工作