ユーザーが入力している間に数値をフォーマットすることは、一般的に非常にうまく機能しません。そのためには MaskedTextBox を使用する必要があります。KeyPress をフィルタリングして数字のみを入力できるようにする方法を示す、インターネットに関する多くのコード。そのほとんどは、貼り付けコマンドを使用することで簡単に無効になります。
健全な方法は、数字を入力するなどの基本的なスキルを備えたユーザーを扱い、それが間違っていることをやさしく思い出させることです。Validating イベントはそのために作られています。これは、数値をフォーマットするのに最適な時期でもあります。プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。
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;
}
コンパイル。ツールボックスの上部から新しい NumberBox コントロールをフォームにドロップします。また、フォームに ErrorProvider をドロップして、入力ミスを控えめな方法で報告できるようにします。新しいコントロールの ErrorProvider プロパティを設定します。必要に応じて Fraction プロパティを変更します。ValueChanged イベントをサブスクライブして、値がいつ変更されたかを知ることができます。