VS2019 C#でWindowsフォームアプリ作成で、数値専用TextBoxの覚書です。Webでは皆さんいろいろ試されているようです。それらのツマミ喰いで自分なりに実装してみました。
キー入力時、検証中、検証後の3段階
まずは、キー入力時
keypressイベントで、数値とピリオド(実数の場合)の入力に限定させる。整数の場合は5行目での’.’の比較を外します。
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
try
{
if (e.KeyChar == 0x08 || e.KeyChar == '.') return; //BS,dot
if (e.KeyChar < 0x30 || e.KeyChar > 0x39) e.Handled = true; //0-9 only
}
catch (Exception ex) { MessageBox.Show("不正な入力", "エラー"); }
}
検証中イベントで
フォーカス脱出中にvaridatingイベントで、数値かそうでないかチェックし、偽ならtextをクリアし、フォーカスを戻す(すこし強引?)。クリアするとマズいときは元の値を記憶しておく、などの処理が必要です。
数値をチェックする関数は正規表現版を使います。
private bool checkNumeric(string strg) {
return System.Text.RegularExpressions.Regex.IsMatch(strg, @"^[-+]?[0-9]*\.?[0-9]+$");
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (checkNumeric(((TextBox)sender).Text) == false) {
((TextBox)sender).Focus();
((TextBox)sender).Text = "";
}
}
最後に検証後イベントで表示を固定
なくてもよいですが、今回の場合は変更したtextが即他のコントロールの表示に影響するので、varidatedイベントで実施。
private void textBox1_Validated(object sender, EventArgs e)
{
// 表示を固定したい処理を記入;
}
正規表現版のチェックは完全ではないらしいですが、いまのところ十分間に合っています