9


0

KeyDownイベント-押されたキーが数字であるかどうかを簡単に知る方法は?

現在、DataGridViewコントロールのKeyDownイベントを処理しています。 列の1つは計算値で満たされているので、必要に応じてユーザーがセルの値をオーバーライドできるようにします。

ユーザーが数字キーを押すと、セルはEditModeになり、ユーザーが値をオーバーライドできるようになります。 キーが数値でない場合、何も起こりません…​

それはかなりうまく機能しています…​ 問題は、そのコードが見苦しいことです…​ 単一の条件ですべての数字キーを処理するきちんとした方法を見つけることができないため、次のように、考えられるすべての数字キーを処理するスイッチケース構造を作成しました。

                switch (e.KeyCode)
                {
                    case Keys.D0:
                    case Keys.D1:
                    case Keys.D2:
                    case Keys.D3:
                    case Keys.D4:
                    case Keys.D5:
                    case Keys.D6:
                    case Keys.D7:
                    case Keys.D8:
                    case Keys.D9:
                    case Keys.Decimal:
                    case Keys.NumPad0:
                    case Keys.NumPad1:
                    case Keys.NumPad2:
                    case Keys.NumPad3:
                    case Keys.NumPad4:
                    case Keys.NumPad5:
                    case Keys.NumPad6:
                    case Keys.NumPad7:
                    case Keys.NumPad8:
                    case Keys.NumPad9:

                         [code to make the cell go to editMode, etc...]

確かに機能しますが、より適切で短い方法が必要ですよね?

Googleを使用して見つけることができるのは、e.KeyCodeをcharに変換することだけですが、数値キーを使用すると、数値に対しても文字が表示されます…​

ありがとう。

8 Answer


14


Try

if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
    (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
    e.KeyCode == Keys.Decimal)
{
    // Edit mode
}


11


KeyPress`イベントを使用する場合、イベントシグネチャには、テンキーのキーの文字を提供する KeyChar`メンバーを持つ `KeyPressEventArgs`があります。 その上でTryParseを実行して、その番号がどうかを判断できます。

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}


7


これを使用できるのに、キーコードを使用する理由:

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (Char.IsDigit(e.KeyChar))
        {
            //do something
        }
        else
        {
            //do something else
        }
    }

それはきれいであり、Microsoftがすべての列挙値を変更することを決定した場合でも、それはまだ動作します


6


Sorcerer86ptのソリューションは最も簡単でしたが、ユーザーがバックスペースなどのコントロールキーを押すと壊れます。 この問題を解決するには、次のスニペットを使用できます。

void KeyPress(object sender, KeyPressEventArgs e)
{
    if(!Char.IsNumber(e.KeyChar) && !Char.IsControl(e.KeyChar))
    {
        //The char is not a number or a control key
        //Handle the event so the key press is accepted
        e.Handled = true;
        //Get out of there - make it safe to add stuff after the if statement
        return;
    }
    //e.Handled remains false so the keypress is not accepted
}

WPFを使用している場合、TextBoxにはKeyPressedイベントがないことがあります。 これを修正するために、次のコードを使用しました。

void ValidateKeyPress(object sender, KeyEventArgs e)
{
    char keyPressed = WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key);
    if (!Char.IsNumber(keyPressed) && !Char.IsControl(keyPressed))
    {
        //As above
        e.Handled = true;
        return;
    }
}

奇妙な関数呼び出し `WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key)`に気付くかもしれませんが、これは私が収集した便利な関数の1つです。 http://huddledmasses.org/how-to-get-the-character-and-virtualkey-from-a-wpf-keydown-event/ [こちら]で見つけることができます。


2


数字が押された場合に数字になるキーから最後の文字を取得します。 このメソッドは、他の条件を必要としないKeyDownイベントで機能します。

この静的メソッドを呼び出して、チェックするキーを渡すだけです

public static bool IsNumber(Keys key)
{
  string num = key.ToString().Substring(key.ToString().Length - 1);
  Int64 i64;
  if (Int64.TryParse(num, out i64))
  {
    return true;
  }
  return false;
}


1


msdn help pageでは、例でこのコードを使用しています。

// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)

…​

// Determine whether the keystroke is a number from the keypad.
if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)


1


もう少し凝縮されたバージョン:

    private void KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
    }


0


void dataGridView1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Used this to find they key values.
    //label1.Text += e.KeyValue;

    // Check if key is numeric value.
    if((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 97 && e.KeyValue <= 105))
        System.Console.WriteLine("Pressed key is numeric");
}