Udostępnij za pośrednictwem


How to: Create a Numeric Text Box

You can create a custom control derived from TextBox so that it accepts only numeric input. This example defines the NumericTextBox class and shows how to place it on the form.

Note

For an example of this control that strictly constrains user input, see How to: Control User Input in a Numeric Text Box.

The code in this example verifies the current character whenever a key is pressed. Another way to implement a numeric text box is to use pattern matching to verify the entire input string. For more information, see IsMatch.

To derive a class from TextBox

  • Add the NumericTextBox class to your project.

    Public Class NumericTextBox
        Inherits TextBox
        Private SpaceOK As Boolean = False 
    
        ' Restricts the entry of characters to digits (including hex), 
        ' the negative sign, the e decimal point, and editing keystrokes (backspace). 
        Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)
            MyBase.OnKeyPress(e)
    
            Dim numberFormatInfo As NumberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat
            Dim decimalSeparator As String = numberFormatInfo.NumberDecimalSeparator
            Dim groupSeparator As String = numberFormatInfo.NumberGroupSeparator
            Dim negativeSign As String = numberFormatInfo.NegativeSign
    
            If groupSeparator = CChar(160).ToString() Then
                .groupSeparator = " " 
            End If 
    
            Dim keyInput As String = e.KeyChar.ToString()
    
            If [Char].IsDigit(e.KeyChar) Then 
                ' Digits are OK 
            ElseIf keyInput.Equals(decimalSeparator) OrElse keyInput.Equals(groupSeparator) OrElse keyInput.Equals(negativeSign) Then 
                ' Decimal separator is OK 
            ElseIf e.KeyChar = vbBack Then 
                ' Backspace key is OK 
                '    else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0) 
                '    { 
                '     // Let the edit control handle control and alt key combinations 
                '    } 
            ElseIf Me.SpaceOK AndAlso e.KeyChar = " "c Then 
    
            Else 
                ' Consume this invalid key and beep.
                e.Handled = True 
            End If 
    
        End Sub 
    
    
        Public ReadOnly Property IntValue() As Integer 
            Get 
                Return Int32.Parse(Me.Text)
            End Get 
        End Property 
    
    
        Public ReadOnly Property DecimalValue() As Decimal 
            Get 
                Return [Decimal].Parse(Me.Text)
            End Get 
        End Property 
    
    
        Public Property AllowSpace() As Boolean 
    
            Get 
                Return Me.SpaceOK
            End Get 
            Set(ByVal value As Boolean)
                Me.SpaceOK = value
            End Set 
        End Property 
    End Class
    
    public class NumericTextBox : TextBox
    {
        bool allowSpace = false;
    
        // Restricts the entry of characters to digits (including hex), the negative sign, 
        // the decimal point, and editing keystrokes (backspace). 
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
    
            NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
            string decimalSeparator = numberFormatInfo.NumberDecimalSeparator;
            string groupSeparator = numberFormatInfo.NumberGroupSeparator;
            string negativeSign = numberFormatInfo.NegativeSign;
    
            // Workaround for groupSeparator equal to non-breaking space 
            if (groupSeparator == ((char)160).ToString())
            {
                groupSeparator = " ";
            }
    
            string keyInput = e.KeyChar.ToString();
    
            if (Char.IsDigit(e.KeyChar))
            {
                // Digits are OK
            }
            else if (keyInput.Equals(decimalSeparator) || keyInput.Equals(groupSeparator) ||
             keyInput.Equals(negativeSign))
            {
                // Decimal separator is OK
            }
            else if (e.KeyChar == '\b')
            {
                // Backspace key is OK
            }
            //    else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0) 
            //    { 
            //     // Let the edit control handle control and alt key combinations 
            //    } 
            else if (this.allowSpace && e.KeyChar == ' ')
            {
    
            }
            else
            {
                // Consume this invalid key and beep
                e.Handled = true;
                //    MessageBeep();
            }
        }
    
        public int IntValue
        {
            get
            {
                return Int32.Parse(this.Text);
            }
        }
    
        public decimal DecimalValue
        {
            get
            {
                return Decimal.Parse(this.Text);
            }
        }
    
        public bool AllowSpace
        {
            set
            {
                this.allowSpace = value;
            }
    
            get
            {
                return this.allowSpace;
            }
        }
    }
    

To add the NumericTextBox control to the form

  1. Add the following code to the form's constructor or Load event.

    ' Create an instance of NumericTextBox. 
    Dim NumericTextBox1 As NumericTextBox = New NumericTextBox()
    NumericTextBox1.Parent = Me 
    
    
    ' Draw the bounds of the NumericTextBox.
    NumericTextBox1.Bounds = New Rectangle(5, 5, 150, 100)
    
    // Create an instance of NumericTextBox.
    NumericTextBox numericTextBox1 = new NumericTextBox();
    numericTextBox1.Parent = this;
    
    //Draw the bounds of the NumericTextBox.
    numericTextBox1.Bounds = new Rectangle(5, 5, 150, 100);
    
  2. Add an InputPanel component to your form for user input into the NumericTextBox. For a Smartphone application, you can specify a numeric InputMode.

Compiling the Code

This example requires references to the following namespaces:

See Also

Tasks

How to: Set Smartphone Input Modes

How to: Use the InputPanel Component

Concepts

Custom Control Development

.NET Compact Framework How-to Topics

Change History

Date

History

Reason

May 2009

Added information about regular expressions.

Customer feedback.