Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Numeric TextBox

0.00/5 (No votes)
22 Sep 2008 1  
The textbox that accepts numbers and uses separated character for reading easily

Introduction

I needed one textbox that accepts a number and uses separated character on each three numbers as right.

I searched for this on The Code Project, but couldn't find any such article. So I decided to create this one.

Notice: Numeric TextBox is not MasktextBox, this textBox is dynamic but masktextbox is static. When you changing a number, the position of the separated character changes.

Using the Code

property.jpg

Add numericTextBox in your project, then drag and drop on the form.

Numeric Textbox contains these properties:

  1. MaxValue: With this property, you could enter max of a number as per your requirement.
  2. Invalidsound: In this property, you could set invalid sound for when the user presses the wrong key, e.g. when pressing a letter character.
  3. SeparatedChar: A separated character is a character that is placed between numbers. Default of separated character is ",".
  4. Value: The value of a numeric textbox that you see has Int64 type. When you want to use Int32 type, use this:
(Int32)numericTextBox.Value 

How It Works

NumericTextBox is a textbox that manages the keyPressed event:

protected override void OnKeyPress(KeyPressEventArgs e)
{
            isKeyPress = true;
            base.OnKeyPress(e);
            double val = (this.Text.Length == 0 ? 0 : 
		        double.Parse(this.Text.Replace(sepratedChar.ToString(), "")));

            if (Char.IsDigit(e.KeyChar) && val * 10 + 
			int.Parse(e.KeyChar.ToString()) <= maxValue)
            {
                // Digits are OK
            }
            else if (e.KeyChar == '\b')
            {
                // Backspace key is OK

            }
            else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
            {
                //ModifierKeys + ( Alt & Ctrl ) are OK
            }
            else if (this.SelectionLength > 0)
            {
                // Selected Text OK
            }

            else
            {
                e.handle = true;
            }

Then when text is changed, call SetSepratedChar procedure, in SetSepratedChar while  Value>1000, divide by 1000 and insert SeparatedChar but it's different between digits and Del Key and backspace button, because selectionstart is a different position.

private void SetSepratedChar(int index)
{
	isKeyPress = false;
	isDelKeyPress = false;
	Int64 intValue = Value;
	int selectionStart = this.SelectionStart;

	this.Clear();
	while (intValue >= 1000)
	{
		Int64 mod = intValue % 1000;
		if (mod == 0)
		this.Text = this.Text.Insert(0, sepratedChar.ToString() + "000");
		else if (mod.ToString().Length == 1)this.Text = 
		this.Text.Insert(0, sepratedChar.ToString() + "00" + mod.ToString());

		else if (mod.ToString().Length == 2)
			this.Text = this.Text.Insert(0, 
			sepratedChar.ToString() + "0" + mod.ToString());
		else
			this.Text = this.Text.Insert(0, 
			sepratedChar.ToString() + mod.ToString());

		intValue = intValue / 1000;
	}

	this.Text = this.Text.Insert(0, intValue.ToString());
	this.SelectionStart = selectionStart + index;
}

I needed an integer number, but if you think this component is useful for decimal numbers, please let me know.

Please give me some tips.

poem.jpg

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here