Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8000481
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 4, 20262026-06-04T15:48:30+00:00 2026-06-04T15:48:30+00:00

I am fairly new to Winforms, and I would like to know how to

  • 0

I am fairly new to Winforms, and I would like to know how to use a MaskedTextBox to ensure that only numerical values(decimals included) are entered by the user.

I have tried the masked feature using “/^[-+]?[0-9]+(.[0-9]+)?$/” and was not successful with that. What I want, even if with an ordinary textbox, is to allow only numerals/decimal values

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-04T15:48:32+00:00Added an answer on June 4, 2026 at 3:48 pm

    I adapted this NumericTextBox control: http://sanity-free.org/forum/viewtopic.php?pid=1205#p1205

    If you want it apart of your toolbox, you’d probably create a new control based on a TextBox and paste the code in that link into the code section.

    Here’s my version of it. I don’t know how much I’ve modified it as I’ve had it a long time.

    NumericTextBox.Designer.cs:

    using System.Windows.Forms;
    
    namespace SeaRisenLib2.Controls
    {
        partial class NumericTextBox : TextBox
        {
            /// <summary> 
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary> 
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Component Designer generated code
    
            /// <summary> 
            /// Required method for Designer support - do not modify 
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                components = new System.ComponentModel.Container();
                //this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            }
    
            #endregion
        }
    }
    

    NumericTextBox.cs

    // From: http://sanity-free.org/forum/viewtopic.php?pid=1205#p1205
    // modified it slightly
    //
    /******************************************************/
    /*          NULLFX FREE SOFTWARE LICENSE              */
    /******************************************************/
    /*  NumericTextBox Library                            */
    /*  by: Steve Whitley                                 */
    /*  © 2005 NullFX Software                            */
    /*                                                    */
    /* NULLFX SOFTWARE DISCLAIMS ALL WARRANTIES,          */
    /* RESPONSIBILITIES, AND LIABILITIES ASSOCIATED WITH  */
    /* USE OF THIS CODE IN ANY WAY, SHAPE, OR FORM        */
    /* REGARDLESS HOW IMPLICIT, EXPLICIT, OR OBSCURE IT   */
    /* IS. IF THERE IS ANYTHING QUESTIONABLE WITH REGARDS */
    /* TO THIS SOFTWARE BREAKING AND YOU GAIN A LOSS OF   */
    /* ANY NATURE, WE ARE NOT THE RESPONSIBLE PARTY. USE  */
    /* OF THIS SOFTWARE CREATES ACCEPTANCE OF THESE TERMS */
    /*                                                    */
    /* USE OF THIS CODE MUST RETAIN ALL COPYRIGHT NOTICES */
    /* AND LICENSES (MEANING THIS TEXT).                  */
    /*                                                    */
    /******************************************************/
    /* Changed by Carlos Montiers                         */
    /* Decimal separator "." or "," depending on locale   */
    /* Constructor for numericTextBox whith or without    */
    /* negative range and number of decimals.             */
    /* Does not allow the entry of non-numeric character  */
    /* through alt + ascii code                           */
    /* Permit use of tab key                              */
    /* Version: 24-10-2008                                */
    /******************************************************/
    
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Text.RegularExpressions;
    
    namespace SeaRisenLib2.Controls
    {
        public partial class NumericTextBox : TextBox
        {
            private const int WM_KEYDOWN = 0x0100;
            private const int WM_PASTE = 0x0302;
            private int decimalNumbers;
            private bool hasNegatives;
            private string format;
    
            public delegate void D(NumericTextBox sender);
            /// <summary>
            /// Fired when Text changes
            /// </summary>
            public event D Changed = delegate { };
    
            /// <summary>
            /// Constructor of a NumericTextBox, with negative number and 2 decimals.
            /// </summary>
            public NumericTextBox()
                : this(2, true)
            {
            }
    
            /// <summary>
            /// Constructor with parameters
            /// </summary>
            /// <param name="decimalNumbers">number of decimals</param>
            /// <param name="hasNegatives">has negatives</param>
            public NumericTextBox(int decimalNumbers, bool hasNegatives)
                : base()
            {
                InitializeComponent();
                DecimalNumbers = decimalNumbers;
                HasNegatives = hasNegatives;
                Format = Format;
            }
    
            /// <summary>
            /// Property of decimalNumbers
            /// </summary>
            public int DecimalNumbers
            {
                get
                {
                    return decimalNumbers;
                }
                set
                {
                    decimalNumbers = value > 0 ? value : 0;
                }
            }
    
            /// <summary>
            /// Bindable Decimal Text
            /// </summary>
            public decimal DecimalText
            {
                get {
                    if(string.IsNullOrEmpty(Text))
                        return 0;
    
                    return Convert.ToDecimal(Text);
                }
                set { Text = value.ToString(); }
            }
    
            /// <summary>
            /// The string text value of the numeric text, use DecimalText to get the numeric value.
            /// </summary>
            public override string Text
            {
                get { return base.Text; }
                set
                {
                    base.Text = value;
                    Changed(this);
                }
            }
    
            /// <summary>
            /// Property of hasNegatives
            /// </summary>
            public bool HasNegatives
            {
                get
                {
                    return hasNegatives;
                }
                set
                {
                    hasNegatives = value;
                }
            }
    
            /// <summary>
            /// Property of format
            /// </summary>
            public string Format
            {
                get
                {
                    return format;
                }
                set
                {
                    format = "^";
                    format += HasNegatives ? "(\\" + getNegativeSign() + "?)" : "";
                    format += "(\\d*)";
                    if (DecimalNumbers > 0)
                    {
                        format += "(\\" + getDecimalSeparator() + "?)";
                        for (int i = 1; i <= DecimalNumbers; i++)
                        {
                            format += "(\\d?)";
                        }
                    }
                    format += "$";
                }
            }
    
            /// <summary>
            /// Method PreProcessMessage
            /// </summary>
            /// <param name="msg">ref Message</param>
            /// <returns>bool</returns>
            public override bool PreProcessMessage(ref Message msg)
            {
                if (msg.Msg == WM_KEYDOWN)
                {
                    Keys keys = (Keys)msg.WParam.ToInt32();
    
                    bool numbers = ModifierKeys != Keys.Shift
                                    && (keys >= Keys.D0 && keys <= Keys.D9
                                        || (keys >= Keys.NumPad0 && keys <= Keys.NumPad9));
    
    
                    bool dec = ModifierKeys != Keys.Shift
                                && (keys == Keys.Decimal
                                    || keys == Keys.Oemcomma
                                    || keys == Keys.OemPeriod);
    
                    bool negativeSign = (keys == Keys.OemMinus && ModifierKeys != Keys.Shift)
                                        || keys == Keys.Subtract;
    
                    bool home = keys == Keys.Home;
                    bool end = keys == Keys.End;
    
                    bool ctrlZ = keys == Keys.Z && ModifierKeys == Keys.Control;
                    bool ctrlX = keys == Keys.X && ModifierKeys == Keys.Control;
                    bool ctrlC = keys == Keys.C && ModifierKeys == Keys.Control;
                    bool ctrlV = keys == Keys.V && ModifierKeys == Keys.Control;
    
                    bool del = keys == Keys.Delete;
                    bool bksp = keys == Keys.Back;
    
                    bool tab = keys == Keys.Tab;
    
                    bool arrows = keys == Keys.Up
                                  || keys == Keys.Down
                                  || keys == Keys.Left
                                  || keys == Keys.Right;
    
                    if (numbers || del || bksp || arrows || home || end
                        || ctrlC || ctrlX || ctrlV || ctrlZ)
                    {
                        return false;
                    }
                    else
                    {
                        if (dec)
                        {
                            return DecimalNumbers <= 0;
                        }
                        else
                        {
                            if (negativeSign)
                            {
                                return !HasNegatives;
                            }
                            else
                            {
                                if (tab)
                                {
                                    return base.PreProcessMessage(ref msg);
                                }
                                else
                                {
                                    return true;
                                }
                            }
                        }
                    }
                }
                else
                {
                    return base.PreProcessMessage(ref msg);
                }
            }
    
            /// <summary>
            /// Method WndProc
            /// </summary>
            /// <param name="m">ref Message</param>
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_PASTE)
                {
                    IDataObject obj = Clipboard.GetDataObject();
                    string input = (string)obj.GetData(typeof(string));
                    string pasteText = getPosibleText(input);
    
                    if (!isValidadFormat(pasteText))
                    {
                        m.Result = (IntPtr)0;
                        return;
                    }
                }
                base.WndProc(ref m);
            }
    
            /// <summary>
            /// Method OnKeyPress
            /// </summary>
            /// <param name="e">KeyPressEventArgs</param>
            protected override void OnKeyPress(KeyPressEventArgs e)
            {
                base.OnKeyPress(e);
                string keyInput = e.KeyChar.ToString();
                string inputText = getPosibleText(keyInput);
    
                if (Char.IsDigit(e.KeyChar)
                    || keyInput.Equals(getDecimalSeparator())
                    || keyInput.Equals(getNegativeSign()))
                {
                    e.Handled = !isValidadFormat(inputText);
                }
                else if (e.KeyChar == '\b'
                        || e.KeyChar == '\t'
                        || keyInput.Equals(Keys.Delete.ToString())
                        || keyInput.Equals(Keys.Home.ToString())
                        || keyInput.Equals(Keys.End.ToString()))
                {
                    //Allow backspace, tab, delete, home, end
                }
                else if (e.KeyChar == 26
                         || e.KeyChar == 24
                         || e.KeyChar == 3
                         || e.KeyChar == 22)
                {
                    // 26 : Allow Ctrl+Z | 24 : Allow Ctrl+X
                    //  3 : Allow Ctrl+C | 22 : Allow Ctrl+V
                }
                else
                {
                    //Disallow
                    e.Handled = true;
                }
            }
    
            /// <summary>
            /// Method OnTextChanged
            /// </summary>
            /// <param name="e">System.EventArgs</param>
            protected override void OnTextChanged(System.EventArgs e)
            {
                if (getFloatValue() < 0)
                {
                    this.ForeColor = Color.Red;
                }
                else
                {
                    this.ForeColor = Color.Black;
                }
    
                //If the decimal point is preceded by a no number is added zero
                if (this.Text.StartsWith(getNegativeSign() + getDecimalSeparator()))
                {
                    this.Text = getNegativeSign() + "0" + this.Text.Substring(1);
                    this.Select(3, 0);
                }
                else
                {
                    if (this.Text.StartsWith(getDecimalSeparator()))
                    {
                        this.Text = "0" + this.Text;
                        this.Select(2, 0);
                    }
                }
                base.OnTextChanged(e);
            }
    
            /// <summary>
            /// Method for validate text with format
            /// </summary>
            /// <param name="text">text</param>
            /// <returns>is valid format</returns>
            private bool isValidadFormat(string text)
            {
                return Regex.IsMatch(text, Format);
            }
    
            /// <summary>
            /// Method for get deciamal separator
            /// </summary>
            /// <returns>Decimal Separator of current culture</returns>
            private string getDecimalSeparator()
            {
                return System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
            }
    
            /// <summary>
            /// Method for get negative sign
            /// </summary>
            /// <returns>Negative Sign of current culture</returns>
            private string getNegativeSign()
            {
                return System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NegativeSign;
            }
    
            /// <summary>
            /// Method for get posible resulting text for input text
            /// </summary>
            /// <param name="text">string with input text</param>
            /// <returns>posible text</returns>
            private string getPosibleText(string text)
            {
                string rText;
                rText = this.Text.Substring(0, SelectionStart);
                rText += text;
                rText += this.Text.Substring(SelectionStart + SelectionLength);
                return rText;
            }
    
            /// <summary>
            /// Method for get int value of text
            /// </summary>
            /// <returns>int value</returns>
            public int getIntValue()
            {
                try
                {
                    return (int)getFloatValue();
                }
                catch
                {
                    return 0;
                }
            }
    
            /// <summary>
            /// Method for get round int value of text
            /// </summary>
            /// <returns>round int value</returns>
            public int getIntRoundValue()
            {
                try
                {
                    return (int)Math.Round(getFloatValue());
                }
                catch
                {
                    return 0;
                }
            }
    
            /// <summary>
            /// Method for get float value of text
            /// </summary>
            /// <returns>float value</returns>
            public float getFloatValue()
            {
                try
                {
                    return float.Parse(this.Text);
                }
                catch
                {
                    return 0;
                }
            }
    
    
        }
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

In fairly new to MVC and I would like to use a session. I
I'm fairly new to ruby and I've got a hash that looks like so:
Fairly new to database schema (plan to use SQLite). Having said that, I'm thinking
I'm fairly new to database programming in WinForms, and have been using BindingSource, DataSet,
I fairly new to JQuery and perhaps trying to achieve something that might be
I'm new to WPF and come from a WinForms background and have a fairly
Fairly new to Google Maps API. I've got an array of data that I
Fairly new to sqlite (and sql). For each row in a table, I'd like
fairly new Android developer here. I've come across a strange problem that I'm not
I started a new winforms project, fairly simple, has a few labels, text boxes,

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.