現在、DataGridViewコントロールのKeyDownイベントを処理しています。列の1つに計算値が入力されているので、必要に応じてユーザーがセル値を上書きできるようにします。
ユーザーが数字キーを押すと、セルはEditModeになり、ユーザーが値を上書きできるようになります。キーが数値でない場合、何も起こりません...
それはかなりうまく機能しています...問題は、そのコードが醜いことです...単一の条件ですべての数値キーを処理するためのきちんとした方法を見つけることができないようですので、切り替えました次のように、考えられるすべての数値キーを処理するcase構文。
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に変換することだけですが、数値キーを使用すると、数値に対しても文字が表示されます...
ありがとう。
KeyPress
イベントを使用する場合、イベント署名にはKeyPressEventArgs
とKeyChar
メンバーがあり、数字パッドキーの文字を指定します。その上でTryParseを実行して、その数かどうかを判断できます。
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
int i;
if (int.TryParse(e.KeyChar.ToString(), out i))
{
MessageBox.Show("Number");
}
}
試してみてください
if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
(e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
e.KeyCode == Keys.Decimal)
{
// Edit mode
}
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つです。あなたはそれを見つけることができます ここ 。
これを使用できるのに、なぜキーコードを使用するのか:
void Control_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsDigit(e.KeyChar))
{
//do something
}
else
{
//do something else
}
}
それはよりクリーンであり、Microsoftがすべての列挙型の値を変更することを決定した場合でも、それはまだ機能します
数字が押された場合に数字になるキーから最後の文字を取得するだけです。このメソッドは、他の条件を必要としない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;
}
もう少し凝縮されたバージョン:
private void KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !Char.IsDigit(e.KeyChar); // only allow a user to enter numbers
}
msdnヘルプページ では、例で次のコードを使用しています。
// 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)
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");
}