C#アプリケーションのテキストボックスで数値入力のみを受け入れるようにすることは、データの整合性と良好なユーザーエクスペリエンスにとって非常に重要です。これにより、無効な入力の防止とデータ処理の簡素化が実現します。この記事では、この目標を達成するための3つの効果的な方法を説明します。それぞれ柔軟性と複雑さのレベルが異なります。
目次
KeyPressEventArgs
を使用した入力の検証
このアプローチでは、テキストボックス内で許可されるキーを直接制御できます。KeyPress
イベントは、押されたキーが数字(0~9)またはバックスペースかどうかを確認するために処理されます。
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// 数字(0~9)とバックスペースのみ許可
if (!char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
{
e.Handled = true; // キー押下を抑制
}
}
この方法は、単純な整数入力の検証に対して簡潔で効率的です。char.IsDigit(e.KeyChar)
はキーが数字かどうかを確認し、e.KeyChar != (char)8
は削除のためのバックスペースを許可します。e.Handled = true
は、数字以外のキーが入力されるのを防ぎます。
正規表現を使用した柔軟な検証
正規表現は、特に複雑な数値形式(例:小数、科学表記法)を処理する場合に役立つ、強力で適応性の高いソリューションを提供します。Regex.IsMatch()
メソッドは、テキストボックスのテキストが定義された数値パターンに準拠しているかどうかを確認します。
private void textBox2_TextChanged(object sender, EventArgs e)
{
// 数字とオプションで小数点を許可
string pattern = @"^[0-9]*(.[0-9]+)?$";
if (!Regex.IsMatch(textBox2.Text, pattern))
{
// 前の有効な値を復元するか、テキストボックスをクリアします。エラー処理はここで重要です。
// より堅牢なソリューションとしては、最後に有効だった値を追跡することを検討してください。
textBox2.Text = textBox2.Text.Substring(0, textBox2.Text.Length - 1);
textBox2.SelectionStart = textBox2.Text.Length; // キャレットの位置を設定
}
}
パターン@"^[0-9]*(.[0-9]+)?$"
は、0個以上の数字([0-9]*
)を、オプションで小数点と1個以上の数字((.[0-9]+)?
)で続けることができます。^
と$
のアンカーは、文字列全体がパターンに一致することを保証します。入力が一致しない場合、最後の文字が削除されます。本番アプリケーションでは、より高度なエラー処理を検討してください。
NumericUpDown
コントロールの活用
組み込みのNumericUpDown
コントロールは、数値入力のためのユーザーフレンドリーで簡単なソリューションを提供します。数値の入力に固有の制限があり、インクリメント/デクリメントボタンや範囲検証などの機能を提供します。
// フォームにNumericUpDownコントロールを追加する(例:numericUpDown1)
// 必要に応じてプロパティを設定する(Minimum、Maximum、DecimalPlacesなど)
// numericUpDown1.Valueを使用して値にアクセスする
int numericValue = (int)numericUpDown1.Value;
これは、ニーズがその機能と一致する場合に最も簡単なオプションです。検証を自動的に処理し、明確なユーザーインターフェースを提供します。ただし、高度にカスタマイズされた検証やフォーマットが必要なシナリオには適していない場合があります。
最適な方法は、具体的な要件によって異なります。単純な整数入力の場合、KeyPressEventArgs
は効率的です。複雑な形式または向上したユーザーエクスペリエンスの場合、正規表現またはNumericUpDown
の方が適しています。常にエラー処理とユーザーエクスペリエンスを考慮してください。