9

これは簡単なことのように思えますが、ここで何が必要かを理解するのに苦労しています。

「KeyDown」イベントハンドラーで、「e.KeyValue」が数値の場合、それを数値として扱い、intとして格納したいと思います。したがって、テンキーで「8」を押した場合、「Numpad8」は必要ありません。加算または減算できるint値8などが必要です。

では、KeyValueからintに変換するにはどうすればよいですか?

4

11 に答える 11

17

私はこの解決策を選びます:

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);
}

...ポイントがパンチインされたキーのラベルの数値を取得することであった場合。

于 2009-04-20T18:43:15.320 に答える
5

このようなものはうまくいくはずです:(編集済み)

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;
}
于 2009-04-20T18:48:08.197 に答える
5

事実:キーボードにはキーがあります。一部のキーは数字を表し、一部はそうではありません。

問題(言い換え):キーが数値を表す場合、キーで表される数値を生成します。

この問題を解決するには、(すべてのキーのセットのうち)どのキーが数値を表すか、および各(数値)キーが表す正確な数値を知る必要があります。

私の知る限り、フレームワークからそのようなマッピングを取得する簡単な方法はありません。

注:キー列挙型でD0-D9とNumPad0-NamPad9がシーケンシャルであるという事実は偶然であり、これらの値がシーケンシャルに順序付けられていることに依存することは根拠がありません。

したがって、解決策は次のようになります。

  1. 指定されたキーが数字を表すかどうかを判別します。
  2. キーが数値を表す場合は、キーの数値を返します。

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;
}

間違いなく、最も単純なソリューションではなく、ソリューションを厳密にモデル化したソリューションです。

于 2009-04-20T21:20:39.467 に答える
2

追跡しているキーの数に応じて、キーダウンの値をチェックし、その値に応じて値を割り当てるselect case(またはC#のswitchステートメント)を作成するのが最も簡単な方法です。適切な整数。

于 2009-04-20T18:34:23.237 に答える
2

NUMERIC値が必要な場合は、switch(e.KeyCode)ステートメントを作成してキーを評価し、独自のintを作成する必要があります。Keysキーの数字を表す数値にaを変換する簡単な方法はありません。最も近いものはASCIIに相当するものである可能性がありますが、それでも変換する必要があります。

于 2009-04-20T18:43:11.390 に答える
1

KeyPress代わりにイベントを聞いていただけませんか?実際に押されたキャラクターになります。

于 2009-04-20T18:43:53.917 に答える
1

この関数はあなたが望むことをします:

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);  
}
于 2009-04-20T18:47:02.253 に答える
0

KeyValueは、押されたキーの文字コードを表します。その数値値を取得するには、押されたキーの文字を見つけて、それを文字から整数に解析する必要があります。

Convert.ToInt32(e.KeyCode.ToString())のようなもの

于 2009-04-20T18:46:39.370 に答える
0

または、拡張メソッドを作成して、次のように呼び出します

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...    }

        }
    }
}
于 2009-04-20T18:59:55.127 に答える
0

私はこの2行の単純なコードを使用しました:

string key = e.KeyCode.ToString();

if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");
于 2019-10-17T14:54:33.513 に答える
-3

int i =(int)e.KeyValue;

于 2009-04-20T18:35:36.917 に答える