65.9K
CodeProject is changing. Read more.
Home

Numeric TextBox

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.46/5 (11 votes)

Sep 22, 2008

CPOL

1 min read

viewsIcon

44794

downloadIcon

1472

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