これは簡単なことのように思えますが、ここで何が必要かを理解するのに苦労しています。
「KeyDown」イベントハンドラーで、「e.KeyValue」が数値の場合、それを数値として扱い、intとして格納したいと思います。したがって、テンキーで「8」を押した場合、「Numpad8」は必要ありません。加算または減算できるint値8などが必要です。
では、KeyValueからintに変換するにはどうすればよいですか?
私はこの解決策を選びます:
int value = -1;
if (e.KeyValue >= ((int) Keys.NumPad0) && e.KeyValue <= ((int) Keys.NumPad9)) { // numpad
value = e.KeyValue - ((int) Keys.NumPad0);
} else if (e.KeyValue >= ((int) Keys.D0) && e.KeyValue <= ((int) Keys.D9)) { // regular numbers
value = e.KeyValue - ((int) Keys.D0);
}
...ポイントがパンチインされたキーのラベルの数値を取得することであった場合。
このようなものはうまくいくはずです:(編集済み)
int keyVal = (int)e.KeyValue;
int value = -1;
if ((keyVal >= (int)Keys.D0 && keyVal <= (int)Keys.D9)
{
value = (int)e.KeyValue - (int)Keys.D0;
}
else if (keyVal >= (int)Keys.NumPad0 && keyVal <= (int)Keys.NumPad9)
{
value = (int)e.KeyValue - (int)Keys.NumPad0;
}
事実:キーボードにはキーがあります。一部のキーは数字を表し、一部はそうではありません。
問題(言い換え):キーが数値を表す場合、キーで表される数値を生成します。
この問題を解決するには、(すべてのキーのセットのうち)どのキーが数値を表すか、および各(数値)キーが表す正確な数値を知る必要があります。
私の知る限り、フレームワークからそのようなマッピングを取得する簡単な方法はありません。
注:キー列挙型でD0-D9とNumPad0-NamPad9がシーケンシャルであるという事実は偶然であり、これらの値がシーケンシャルに順序付けられていることに依存することは根拠がありません。
したがって、解決策は次のようになります。
private static readonly IDictionary<Keys, int> NumericKeys =
new Dictionary<Keys, int> {
{ Keys.D0, 0 },
{ Keys.D1, 1 },
{ Keys.D2, 2 },
{ Keys.D3, 3 },
{ Keys.D4, 4 },
{ Keys.D5, 5 },
{ Keys.D6, 6 },
{ Keys.D7, 7 },
{ Keys.D8, 8 },
{ Keys.D9, 9 },
{ Keys.NumPad0, 0 },
{ Keys.NumPad1, 1 },
{ Keys.NumPad2, 2 },
{ Keys.NumPad3, 3 },
{ Keys.NumPad4, 4 },
{ Keys.NumPad5, 5 },
{ Keys.NumPad6, 6 },
{ Keys.NumPad7, 7 },
{ Keys.NumPad8, 8 },
{ Keys.NumPad9, 9 }
};
private int? GetKeyNumericValue(KeyEventArgs e) {
if (NumericKeys.ContainsKey(e.KeyCode)) return NumericKeys[e.KeyCode];
else return null;
}
間違いなく、最も単純なソリューションではなく、ソリューションを厳密にモデル化したソリューションです。
追跡しているキーの数に応じて、キーダウンの値をチェックし、その値に応じて値を割り当てるselect case(またはC#のswitchステートメント)を作成するのが最も簡単な方法です。適切な整数。
NUMERIC値が必要な場合は、switch(e.KeyCode)
ステートメントを作成してキーを評価し、独自のintを作成する必要があります。Keys
キーの数字を表す数値にaを変換する簡単な方法はありません。最も近いものはASCIIに相当するものである可能性がありますが、それでも変換する必要があります。
KeyPress
代わりにイベントを聞いていただけませんか?実際に押されたキャラクターになります。
この関数はあなたが望むことをします:
private int GetKeyValue(int keyValue)
{
if (keyValue >= 48 && keyValue <= 57)
{
return keyValue - 48;
}
else if (keyValue >= 96 && keyValue <= 105)
{
return keyValue - 96;
}
else
{
return -1; // Not a number... do whatever...
}
}
そのように呼んでください:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int num = GetKeyValue(e.KeyValue);
}
KeyValueは、押されたキーの文字コードを表します。その数値値を取得するには、押されたキーの文字を見つけて、それを文字から整数に解析する必要があります。
Convert.ToInt32(e.KeyCode.ToString())のようなもの
または、拡張メソッドを作成して、次のように呼び出します
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
int num = e.KeyValue.GetKeyValue();
}
ここで、拡張メソッドは
public static class MyExtensions
{
public static int GetKeyValue(this int keyValue)
{
if (keyValue >= 48 && keyValue <= 57)
{
return keyValue - 48;
}
else if (keyValue >= 96 && keyValue <= 105)
{
return keyValue - 96;
}
else
{
return -1; // Not a number... do whatever... }
}
}
}
私はこの2行の単純なコードを使用しました:
string key = e.KeyCode.ToString();
if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
int i =(int)e.KeyValue;