2016-10-11 6 views
0

Ich arbeite derzeit an einem Rechner-Projekt, und ich habe in zwei Probleme geraten. Das erste Problem besteht darin, wie das Tastendruck-Ereignis behandelt wird, so dass Zahlen plus (+ -/*.) Alle funktionieren, aber jeder andere Schlüssel blockiert wird. Heres des Code im zur Zeit mit:Rechner Tastendruck Griff

if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) 
{ 
    e.Handled = true; 
} 

Ich weiß, dass ich jedes Symbol einzeln unter Verwendung && (e.KeyChar != '+') && (e.KeyChar != '-') hinzufügen könnte, aber ist es eine einfache effiziente Art und Weise des Griffes all diese Schlüssel?

Edit: Leider vergaß zu erwähnen, dass mein Rechner ein Textfeld verwendet, damit ist, warum ich

Meine zweite Frage ist die Verwendung von Buchstaben und einige Symbole blockieren müssen, wie kann ich den Benutzer in der Lage zu stoppen zu schreiben zwei oder mehr Dezimalpunkte in einer Zahl, zum Beispiel 9.5.6 oder 0.3.2.9?

Dank

+1

Dies wird durch eine State gelöst werden können. Sehen Sie sich https://github.com/dotnet-state-machine/stateless an. –

+0

Je nachdem, welches Ereignis Sie bearbeiten, sollten Sie sicherstellen, dass keine anderen Schlüssel das Ereignis auslösen. Z.B. 'if (e.KeyChar == '+') {} sonst if (e.KeyChar == '-') {}'. –

+0

Für die zweite Frage wäre eine chaotische Lösung, einen globalen booleschen Wert (z. B. isDecimalEntered) zu behalten und das textbox textchanged -Ereignis zu behandeln, wobei jedes Mal der boolean aktualisiert wird. Eine bessere Lösung wäre, Decimal.TryParse() in der Textchanged-Prozedur zu verwenden. Für Referenz: [Decimal.TryParse-Methode (String, Dezimal)] (https://msdn.microsoft.com/en-us/library/9zbda557 (v = vs.110) .aspx) –

Antwort

0

Deklarieren char-Array auf Klassenstufe:

private char[] allowed = new char[] 
{ 
    '/','*','+','-' 
}; 

Auf Tastendruck-Ereignis:

if (!char.IsDigit(e.KeyChar) && !allowed.Contains(e.KeyChar)) 
    { 
     e.Handled = true; 
    }