在C#.NET中接受十进制的自定义文本框

在C#.NET中接受十进制的自定义文本框,c#,windows,user-controls,decimal,C#,Windows,User Controls,Decimal,我使用C#.NET为Windows应用程序创建了一个自定义文本框。它必须接受十进制(浮点数),如8.32和16.002 我构造了以下算法。它只接受纯数字。我不知道如何让它也接受浮动 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.F

我使用C#.NET为Windows应用程序创建了一个自定义文本框。它必须接受十进制(浮点数),如8.32和16.002

我构造了以下算法。它只接受纯数字。我不知道如何让它也接受浮动

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace SmartTextBoxLib
{
    public partial class SmartTextBox : TextBox
    {
        public SmartTextBox()
        {
            InitializeComponent();
        }
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }
    }
}
使用

System.Windows.Forms.NumericUpDown 
相反,它将为您执行此操作。

您可以使用:

if (!char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    e.Handled = true;
base.OnKeyPress(e);
允许使用数字字符或
。 如果你用它来分隔小数,你可以把它变成


或者,您可以这样做:

decimal value;
e.Handled = !decimal.TryParse((sender as TextBox).Text + e.KeyChar, out value);
base.OnKeyPress(e);
您可以使用文本框控件

在MaskedTextBox控件上定义了掩码属性:

maskedTextBoxInstance.Mask = "99.000";

OnKeyPress
是错误的事件。如果有人用鼠标将文本粘贴到您的文本框中会怎样?你只需要使用一个现有的屏蔽文本框,我知道屏蔽文本框的存在。为了学习,我只是想重新发明轮子。因此,如果您能提出任何替代方案,我们将不胜感激。请致电什么活动?或者检查什么条件?@Samik:它有一个名为
Value
Decimal
属性。我明白了。但是,如果我想将文本框的行为修改为只接受十进制,我应该如何重写我的算法?因此
21.47..1.5..
是一个有效的数字?谢谢。通过更多的修改,比如OnTextChanged事件修改,我最终可以让它工作并定义数字,比如21.47..1.5。。无效。@Samik:添加了一个替代项。非常感谢。这是一个比我计划的更好的选择。@Samik:Oops,我刚刚意识到我需要添加
+e.KeyChar
部分并编辑了答案。