[C#] NumericUpDownでキーボードから数字以外入力できないようにする方法

C#のNumericUpDownコントロールでキーボードから数字以外の入力を防ぐには、KeyPressイベントを利用します。

このイベントで入力されたキーをチェックし、数字や制御キー(例えば、Backspace)以外のキーが押された場合には、その入力を無効にします。

具体的には、KeyPressEventArgsHandledプロパティをtrueに設定することで、無効なキー入力をキャンセルできます。

これにより、ユーザーが数字以外の文字を入力しようとした際に、その入力が無視されるようになります。

この記事でわかること
  • KeyPressイベントの基本的な使い方
  • NumericUpDownでの入力制御方法
  • 小数点や特定キーの入力許可
  • 入力制限のカスタマイズ手法
  • 他のコントロールへの応用方法

目次から探す

KeyPressイベントの活用

KeyPressイベントとは

KeyPressイベントは、Windowsフォームアプリケーションにおいて、ユーザーがキーボードから入力を行った際に発生するイベントです。

このイベントを利用することで、特定のキー入力に対して処理を行ったり、入力内容を制御したりすることができます。

NumericUpDownコントロールにおいて、数字以外の入力を防ぐために非常に有用です。

KeyPressイベントの設定方法

KeyPressイベントを設定するには、まずNumericUpDownコントロールをフォームに追加し、そのプロパティからKeyPressイベントを選択します。

以下の手順で設定できます。

  1. Visual Studioでフォームを開く
  2. NumericUpDownコントロールをフォームにドラッグ&ドロップ
  3. プロパティウィンドウで「イベント」タブを選択
  4. KeyPressイベントの隣にある空欄をダブルクリック

これにより、KeyPressイベントのハンドラが自動的に生成されます。

KeyPressイベントでの入力制御

KeyPressイベントを使用して、NumericUpDownコントロールに数字以外の入力を制限する方法を以下に示します。

サンプルコードでは、数字と制御キー(Backspaceなど)のみを許可するように設定しています。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
        numericUpDown1.KeyPress += new KeyPressEventHandler(numericUpDown1_KeyPress);
    }
    private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
    {
        // 数字と制御キーのみを許可
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
        {
            e.Handled = true; // 入力を無効にする
        }
    }
}

このコードでは、KeyPressイベントが発生した際に、入力された文字が数字または制御キーでない場合、e.Handledtrueに設定することで、その入力を無効にしています。

これにより、NumericUpDownコントロールには数字のみが入力可能となります。

実装手順

KeyPressイベントハンドラの追加

KeyPressイベントハンドラを追加することで、NumericUpDownコントロールに対するキーボード入力を制御できます。

以下の手順でハンドラを追加します。

  1. Visual Studioでフォームを開く
  2. NumericUpDownコントロールを選択
  3. プロパティウィンドウの「イベント」タブを開く
  4. KeyPressイベントの隣にある空欄をダブルクリック

これにより、KeyPressイベントに対応するメソッドが自動生成されます。

以下は、生成されたメソッドの例です。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // ここに入力制御のロジックを追加します
}

数字と制御キーの判定方法

入力された文字が数字または制御キーであるかを判定するためには、char.IsDigitメソッドchar.IsControlメソッドを使用します。

これにより、ユーザーが入力した文字が許可されているかどうかを確認できます。

以下のコードは、判定の実装例です。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // 数字と制御キーのみを許可
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
    {
        e.Handled = true; // 入力を無効にする
    }
}

このコードでは、e.KeyCharが制御キーまたは数字でない場合、e.Handledtrueに設定し、入力を無効にしています。

入力キャンセルの実装

入力をキャンセルするためには、KeyPressイベント内でe.Handledプロパティを使用します。

これにより、特定の条件に基づいて入力を無効にすることができます。

以下は、入力キャンセルの実装例です。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // 数字と制御キーのみを許可
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
    {
        e.Handled = true; // 入力を無効にする
    }
}

このコードを使用することで、NumericUpDownコントロールに対して数字以外の入力を完全にキャンセルすることができます。

これにより、ユーザーは意図しない入力を行うことができなくなります。

応用例

小数点の入力を許可する方法

NumericUpDownコントロールで小数点の入力を許可するには、KeyPressイベント内で小数点.の入力を特別に扱う必要があります。

以下のコードでは、小数点がすでに入力されていない場合にのみ、小数点の入力を許可しています。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // 数字、制御キー、小数点のみを許可
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true; // 入力を無効にする
    }
    // 小数点がすでに入力されているか確認
    if (e.KeyChar == '.' && numericUpDown1.Text.Contains("."))
    {
        e.Handled = true; // 2つ目の小数点を無効にする
    }
}

このコードにより、ユーザーは小数点を含む数値を入力できるようになりますが、同時に複数の小数点を入力することはできません。

特定のキー入力を許可する方法

特定のキー(例えば、矢印キーやEnterキーなど)を許可する場合、KeyPressイベント内でそのキーを判定し、入力を許可することができます。

以下のコードでは、矢印キーとEnterキーを許可しています。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // 数字、制御キー、矢印キー、Enterキーのみを許可
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Enter &&
        e.KeyChar != (char)Keys.Up && e.KeyChar != (char)Keys.Down)
    {
        e.Handled = true; // 入力を無効にする
    }
}

このコードにより、ユーザーは数字や制御キーに加えて、矢印キーやEnterキーを使用して数値を調整できるようになります。

入力制限のカスタマイズ

入力制限をカスタマイズすることで、特定の条件に基づいて入力を制御することができます。

例えば、特定の範囲内の数値のみを許可する場合、以下のように実装できます。

private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
    // 数字、制御キー、小数点のみを許可
    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true; // 入力を無効にする
    }
    // 入力された数値が範囲内か確認
    if (numericUpDown1.Value < 0 || numericUpDown1.Value > 100)
    {
        e.Handled = true; // 範囲外の入力を無効にする
    }
}

このコードでは、NumericUpDownコントロールの値が0から100の範囲内であることを確認し、範囲外の入力を無効にしています。

これにより、ユーザーは指定された範囲内の数値のみを入力できるようになります。

よくある質問

KeyPressイベントが動作しないのはなぜ?

KeyPressイベントが動作しない場合、以下の点を確認してください。

  • コントロールのフォーカス: NumericUpDownコントロールがフォーカスを持っているか確認してください。

フォーカスがないと、イベントは発生しません。

  • イベントハンドラの設定: KeyPressイベントハンドラが正しく設定されているか確認してください。

プロパティウィンドウでイベントが正しく関連付けられているかチェックします。

  • 他のイベントとの干渉: 他のイベント(例えば、KeyDownやKeyUp)が同時に設定されている場合、これらが干渉している可能性があります。

必要に応じて、他のイベントの処理を見直してください。

他の入力制限方法はある?

はい、他にもいくつかの入力制限方法があります。

  • Validatingイベント: フォームのValidatingイベントを使用して、ユーザーが入力した値が有効かどうかを確認できます。
  • MaskTextBoxコントロール: 特定の形式の入力を強制するために、MaskTextBoxコントロールを使用することができます。

これにより、ユーザーは指定された形式に従って入力する必要があります。

  • 正規表現: 正規表現を使用して、入力内容を検証することも可能です。

これにより、より複雑な入力制限を実装できます。

NumericUpDown以外のコントロールでも同様の制限は可能?

はい、NumericUpDown以外のコントロールでも同様の入力制限を実装することが可能です。

以下のコントロールでの実装例を挙げます。

  • TextBox: TextBoxコントロールでもKeyPressイベントを使用して、数字や特定の文字のみを許可することができます。
  • ComboBox: ComboBoxコントロールでも、選択肢を制限するために、SelectedIndexChangedイベントを使用して特定の条件を設定できます。
  • MaskedTextBox: MaskedTextBoxコントロールを使用することで、特定の形式の入力を強制することができます。

これらのコントロールでも、KeyPressイベントや他のイベントを活用することで、ユーザーの入力を制御することができます。

まとめ

この記事では、C#のNumericUpDownコントロールにおけるKeyPressイベントを活用し、キーボードからの入力を制御する方法について詳しく解説しました。

特に、数字以外の入力を防ぐための実装手順や応用例を通じて、さまざまな入力制限の方法を紹介しました。

これを参考にして、実際のアプリケーションにおいてユーザーの入力をより適切に制御し、使いやすいインターフェースを実現してみてください。

  • URLをコピーしました!
目次から探す