9 Stimmen

Wie konvertiere ich einen "Keys"-Enum-Wert in ein "int"-Zeichen in C#?

Dies scheint etwas zu sein, das einfach sein sollte, aber es fällt mir schwer, herauszufinden, was hier geschehen muss.

In der "KeyDown"-Eventhandler, wenn die "e.KeyValue" eine Zahl ist, möchte ich es als eine Zahl zu behandeln und speichern Sie es als eine int. Wenn ich also "8" auf dem Ziffernblock drücke, will ich nicht "Numpad8", sondern den int-Wert 8, den ich addieren oder subtrahieren kann oder was auch immer.

Also, wie konvertiere ich von der KeyValue zu einer int?

17voto

Tommi Forsström Punkte 1467

Ich würde mich für diese Lösung entscheiden:

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

...wenn es darum ginge, den numerischen Wert der Beschriftung der eingegebenen Taste zu ermitteln.

5voto

John Fisher Punkte 21825

So etwas sollte gut funktionieren: (Bearbeitet)

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

5voto

THX-1138 Punkte 20552

Fakten: Die Tastatur hat Tasten. Manche Tasten stehen für Zahlen, manche nicht.

Problem (neu formuliert): Geben Sie einen numerischen Wert, der durch einen Schlüssel repräsentiert wird, aus, wenn der Schlüssel eine Zahl darstellt.

Um das Problem zu lösen, muss man wissen, welche Tasten (aus der Menge aller Tasten) Zahlen darstellen und welchen genauen numerischen Wert jede (Zahlen-)Taste repräsentiert.

Meines Wissens gibt es keine einfache Möglichkeit, eine solche Abbildung aus dem Framework zu erhalten.

Hinweis: Die Tatsache, dass D0-D9 und NumPad0-NamPad9 in der Schlüsselaufzählung aufeinander folgen, ist zufällig, und es ist unbegründet, sich darauf zu verlassen, dass diese Werte in einer bestimmten Reihenfolge angeordnet sind.

Die Lösung wäre also:

  1. Feststellen, ob ein bestimmter Schlüssel eine Zahl darstellt.
  2. Gibt den numerischen Wert des Schlüssels zurück, wenn der Schlüssel eine Zahl darstellt.

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

Das ist zwar nicht die einfachste Lösung, aber diejenige, die der Lösung am nächsten kommt.

2voto

TheTXI Punkte 36691

Je nachdem, wie viele Tasten Sie im Auge behalten, wäre die einfachste Methode für Sie zu einem Select-Case (oder Switch-Anweisung in C # ich schätze?), die den Wert Ihrer keydown überprüfen würde und je nach diesem Wert weisen einen Wert auf eine Ganzzahl, die geeignet ist.

2voto

Adam Robinson Punkte 176996

Wenn Sie NUMERISCHE Werte wünschen, müssen Sie eine switch(e.KeyCode) Anweisung und werten Sie den Schlüssel aus und erstellen Sie Ihre eigene int. Es gibt keine einfache Möglichkeit, eine Keys in einen numerischen Wert umgewandelt, der die Nummer auf der Taste darstellt. Am ehesten käme das ASCII-Äquivalent in Frage, das allerdings noch übersetzt werden müsste.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X