Formatting a number when the user types in general works very poorly. For this you should use MaskedTextBox. There is a lot of code on the Internet that shows how to filter KeyPress, so only numbers can be entered. Most of them are trivially defeated using the Paste command.
A sensible way is to contact a user who is capable of basic skills, for example, dialing a number and gently reminding her that she was wrong. To do this, the Validating event is executed. This is also the perfect time to format your number. Add a new class to the project and paste this code:
using System; using System.ComponentModel; using System.Windows.Forms; public class NumberBox : TextBox { public NumberBox() { Fraction = 2; } public ErrorProvider ErrorProvider { get; set; } [DefaultValue(2)] public int Fraction { get; set; } public event EventHandler ValueChanged; public decimal Value { get { return this.value; } set { if (value != this.value) { this.value = value; this.Text = Value.ToString(string.Format("N{0}", Fraction)); var handler = ValueChanged; if (handler != null) ValueChanged(this, EventArgs.Empty); } } } protected override void OnValidating(CancelEventArgs e) { if (this.Text.Length > 0 && !e.Cancel) { decimal entry; if (decimal.TryParse(this.Text, out entry)) { if (ErrorProvider != null) ErrorProvider.SetError(this, ""); Value = entry; } else { if (ErrorProvider != null) ErrorProvider.SetError(this, "Please enter a valid number"); this.SelectAll(); e.Cancel = true; } } base.OnValidating(e); } protected override void OnEnter(EventArgs e) { this.SelectAll(); base.OnEnter(e); } private decimal value; }
Compile Remove the new NumberBox control from the top of the toolbar into your form. Also discard the ErrorProvider in the form so that printing errors can be reported modestly, set the ErrorProvider property of the new control. Change the fraction property if necessary. You can subscribe to the ValueChanged event to find out when the value was changed.
source share