Winforms文本框-仅允许数字或1位小数

Winforms文本框-仅允许数字或1位小数,winforms,textbox,Winforms,Textbox,如何防止用户输入除数值或带1位小数的十进制值以外的任何内容 应允许用户输入任意长度的字符(如果是十进制值,则在十进制之前)。尝试使用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

如何防止用户输入除数值或带1位小数的十进制值以外的任何内容


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

尝试使用
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,文本框没有撤消状态

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

Regex-match=newregex(@“^[1-9]\d*(.\d{1})?$”;
工作正常

在这一点上,可能会有点晚,但我扩展了一个简单的文本框,以强制条目始终设置为十进制格式。。简单而有效

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
导入System.Runtime.InteropServices
导入System.Drawing.Imaging
导入System.ComponentModel
导入System.Text.RegularExpressions
_
公共类数字文本框
继承文本框
Dim\u TextBoxValue作为字符串
Dim\u CaretPosition作为整数
受保护的覆盖子OnKeyDown(e作为KeyEventArgs)
MyBase.OnKeyDown(e)
_TextBoxValue=Me.Text
_CaretPosition=Me.SelectionStart
端接头
受保护的覆盖子OnKeyUp(e作为KeyEventArgs)
MyBase.OnKeyUp(e)
如果(Me.Text.Length=0)或(Me.Text=_TextBoxValue),则退出Sub
如果是数字(Me.Text),则
如果Me.Text.EndsWith(“.”),则
Me.Text=Convert.ToDecimal(Me.Text)&“
其他的
Me.Text=Convert.ToDecimal(Me.Text)
如果结束
其他的
Me.Text=\u TextBoxValue
如果结束
Me.SelectionStart=\u CaretPosition+1
端接头
末级