Ich habe eine Windows Forms-App mit einem Textfeldsteuerelement, das nur ganzzahlige Werte akzeptieren soll. In der Vergangenheit habe ich diese Art der Validierung durchgeführt, indem ich das KeyPress-Ereignis überladen und nur Zeichen entfernt habe, die nicht der Spezifikation entsprachen. Ich habe mir das MaskedTextBox-Steuerelement angesehen, möchte aber eine allgemeinere Lösung, die möglicherweise mit einem regulären Ausdruck funktioniert oder von den Werten anderer Steuerelemente abhängt.
Im Idealfall würde sich dies so verhalten, dass das Drücken eines nicht numerischen Zeichens entweder kein Ergebnis liefert oder dem Benutzer sofort eine Rückmeldung über das ungültige Zeichen gibt.
Antworten:
Zwei Optionen:
Verwenden Sie
NumericUpDown
stattdessen ein. NumericUpDown übernimmt die Filterung für Sie, was sehr schön ist. Natürlich können Ihre Benutzer auch die Aufwärts- und Abwärtspfeile auf der Tastatur drücken, um den aktuellen Wert zu erhöhen und zu verringern.Behandeln Sie die entsprechenden Tastaturereignisse, um alles andere als numerische Eingaben zu verhindern. Ich hatte Erfolg mit diesen beiden Ereignishandlern auf einer Standard-TextBox:
Sie können die Prüfung für
'.'
(und die nachfolgende Prüfung für mehr als eine'.'
) entfernen, wenn Ihre TextBox keine Dezimalstellen zulassen soll. Sie können auch prüfen,'-'
ob Ihre TextBox negative Werte zulassen soll.Wenn Sie den Benutzer auf die Anzahl der Ziffern beschränken möchten, verwenden Sie:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
quelle
Und nur weil es immer mehr Spaß macht, Dinge in einer Zeile zu erledigen ...
HINWEIS: Dies verhindert NICHT, dass ein Benutzer in dieses Textfeld kopiert / einfügt. Es ist kein ausfallsicherer Weg, Ihre Daten zu bereinigen.
quelle
KeyPress
Ereignisse aus demselben Textfeld verarbeiten. Ein Ereignis könntee.Handled
auf true gesetzt werden, und ein anderes könnte es auf false zurücksetzen. Im Allgemeinen ist es besser zu verwendenif (...) e.Handled = true;
TextChanged
Ereignis, das mit einemIch gehe vom Kontext und den von Ihnen verwendeten Tags davon aus, dass Sie eine .NET C # -App schreiben. In diesem Fall können Sie das Ereignis "Text geändert" abonnieren und jeden Tastendruck überprüfen.
quelle
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Hier ist ein einfaches eigenständiges benutzerdefiniertes Winforms-Steuerelement, das von der Standard-TextBox abgeleitet ist und nur System.Int32-Eingaben zulässt (es kann problemlos für andere Typen wie System.Int64 usw. angepasst werden). Es unterstützt Kopier- / Einfügevorgänge und negative Zahlen:
Update 2017 : Meine erste Antwort hat einige Probleme:
Also habe ich mir eine andere Version ausgedacht, die allgemeiner ist und weiterhin Kopieren / Einfügen, + und - Zeichen usw. unterstützt.
Für Int32 können Sie entweder Folgendes ableiten:
Verwenden Sie das neue TextValidating-Ereignis ohne Ableitung wie folgt:
Aber das Schöne ist, dass es mit jeder Zeichenfolge und jeder Validierungsroutine funktioniert.
quelle
Genau dafür wurden die Validated / Validating-Ereignisse entwickelt.
Hier ist der MSDN-Artikel zum Thema: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Die TL; DR-Version: Überprüfen Sie die .Text-Eigenschaft im Validating-Ereignis und legen Sie fest,
e.Cancel=True
wann die Daten ungültig sind.Wenn Sie e.Cancel = True setzen, kann der Benutzer das Feld nicht verlassen, aber Sie müssen ihm eine Art Feedback geben, dass etwas nicht stimmt. Ich ändere die Hintergrundfarbe der Box auf hellrot, um auf ein Problem hinzuweisen. Stellen Sie sicher, dass Sie es auf
SystemColors.Window
zurücksetzen , wenn Validating mit einem guten Wert aufgerufen wird.quelle
Validating
.<nitpick>
Das OP erwähnt, dass das sofortige Nichtzulassen / Anzeigen eines ungültig machenden Zeichens ideal ist, aberValidating
anscheinend erfordert, dass der Fokus auf eine andere Form / Steuerung verschoben wird, bevor er wirksam wird.</nitpick>
Trotzdem ist dies ein großartiger Ansatz und im allgemeineren Fall immer eine Überlegung wert.Versuchen Sie es mit einer MaskedTextBox . Es wird ein einfaches Maskenformat verwendet, sodass Sie die Eingabe auf Zahlen oder Datumsangaben oder was auch immer beschränken können.
quelle
Sie können das
TextChanged
Ereignis verwendenquelle
Undo()
, aber es führt zu einemStackOverflowException
.public int txtBoxValue
, und wenn tryParse nicht funktioniert, setze ich Text in txtBox vontxtBox.Text = txtBoxValue.ToString();
Dies könnte nützlich sein. Es erlaubt "reelle" numerische Werte, einschließlich korrekter Dezimalstellen und vorhergehender Plus- oder Minuszeichen. Rufen Sie es innerhalb des zugehörigen KeyPress-Ereignisses auf.
quelle
Ich habe an einer Sammlung von Komponenten gearbeitet, um fehlende Inhalte in WinForms zu vervollständigen. Hier ist es: Erweiterte Formulare
Dies ist insbesondere die Klasse für eine Regex TextBox
Es
myNumbericTextBox.RegexString = "^(\\d+|)$";
sollte ausreichen, einfach so etwas hinzuzufügen .quelle
Verwenden Sie einfach ein
NumericUpDown
Steuerelement und stellen Sie die Sichtbarkeit dieser hässlichen Auf-Ab-Schaltflächen auf einfalse
.NumericUpDown
ist eigentlich eine Sammlung von Steuerelementen, die ein 'Drehfeld' (Auf-Ab-Schaltflächen), ein Textfeld und einen Code enthalten, um alles zu validieren und durcheinander zu bringen.Markierung:
blendet die Schaltflächen aus, während der zugrunde liegende Code aktiv bleibt.
Obwohl dies keine offensichtliche Lösung ist, ist es einfach und effektiv.
.Controls[1]
würde den Textfeldteil ausblenden, wenn Sie das stattdessen tun wollten.quelle
Ich habe auf CodePlex etwas dafür gemacht .
Es funktioniert durch Abfangen des TextChanged-Ereignisses. Wenn das Ergebnis eine gute Zahl ist, wird es gespeichert. Wenn etwas nicht stimmt, wird der letzte gute Wert wiederhergestellt. Die Quelle ist etwas zu groß, um hier veröffentlicht zu werden, aber hier ist ein Link zu der Klasse , die den Kern dieser Logik behandelt.
quelle
Verwenden Sie einfach diesen Code im Textfeld:
quelle
Auf unserer Webseite mit der Definition des Textfelds können wir ein
onkeypress
Ereignis hinzufügen , bei dem nur Zahlen akzeptiert werden. Es wird keine Meldung angezeigt, aber es wird verhindert, dass Sie falsche Eingaben machen. Es hat bei mir funktioniert, der Benutzer konnte nur die Nummer eingeben.quelle
Sie können das TextChanged / Keypress-Ereignis verwenden, einen regulären Ausdruck verwenden, um nach Zahlen zu filtern und Maßnahmen zu ergreifen.
quelle
Ich würde es im KeyDown-Ereignis behandeln.
quelle
versuchen Sie dies ist sehr einfach
quelle
Sehen Sie sich die Eingabebehandlung in WinForm an
Ich habe meine Lösung veröffentlicht, die die ProcessCmdKey- und OnKeyPress-Ereignisse im Textfeld verwendet. Die Kommentare zeigen Ihnen, wie Sie mit einem Regex den Tastendruck überprüfen und entsprechend blockieren / zulassen.
quelle
Hallo, Sie können so etwas im textveränderten Ereignis des Textfelds tun.
Hier ist eine Demo
quelle
Es scheint, dass viele der aktuellen Antworten auf diese Frage den Eingabetext manuell analysieren. Wenn Sie nach einem bestimmten integrierten numerischen Typ suchen (z. B.
int
oderdouble
), können Sie die Arbeit einfach an dieTryParse
Methode dieses Typs delegieren . Zum Beispiel:Wenn Sie etwas allgemeineres möchten, aber dennoch mit dem Designer von Visual Studio kompatibel sind:
Und schließlich, wenn Sie etwas generisches möchten und sich nicht für die Designer-Unterstützung interessieren:
quelle
Sowohl Ganzzahlen als auch Gleitkommazahlen müssen akzeptiert werden, einschließlich der negativen Zahlen.
quelle
Das ist mein Ansatz:
und beliebige Größen
quelle
Mit dem in Fabio Iottis Antwort beschriebenen Ansatz habe ich eine allgemeinere Lösung geschaffen:
"ValidatedTextBox", die alle nicht trivialen Validierungsverhalten enthält. Sie müssen nur noch von dieser Klasse erben und die "IsValid" -Methode mit der erforderlichen Validierungslogik überschreiben. Mit dieser Klasse ist es beispielsweise möglich, "RegexedTextBox" zu erstellen, die nur Zeichenfolgen akzeptiert, die einem bestimmten regulären Ausdruck entsprechen:
Danach können wir, indem wir von der Klasse "RegexedTextBox" erben, einfach die Steuerelemente "PositiveNumberTextBox" und "PositiveFloatingPointNumberTextBox" erstellen:
quelle
Es tut mir leid, die Toten zu wecken, aber ich dachte, jemand könnte dies als zukünftige Referenz nützlich finden.
So gehe ich damit um. Es verarbeitet Gleitkommazahlen, kann jedoch leicht für Ganzzahlen geändert werden.
Grundsätzlich können Sie nur 0 - 9 und drücken .
Sie können nur eine 0 vor dem haben .
Alle anderen Zeichen werden ignoriert und die Cursorposition beibehalten.
Hier ist eine schnell modifizierte int-Version:
quelle
Dieser arbeitet mit Kopieren und Einfügen, Ziehen und Ablegen, Drücken der Taste, verhindert Überlauf und ist ziemlich einfach
quelle
Vergessen Sie nicht, dass ein Benutzer einen ungültigen Text in a einfügen kann
TextBox
.Wenn Sie dies einschränken möchten, befolgen Sie den folgenden Code:
quelle
Ich suchte auch nach dem besten Weg, um nur Zahlen im Textfeld zu überprüfen, und das Problem mit dem Tastendruck war, dass das Einfügen durch Kopieren per Rechtsklick oder Zwischenablage nicht unterstützt wird. Daher wurde dieser Code entwickelt, der überprüft, wann der Cursor das Textfeld verlässt und auch nach prüft leeres Feld. (angepasste Version von Newguy)
quelle
quelle
3 Lösung
1)
2) eine andere Lösung von msdn
}}
Quelle http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) Verwenden der MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
quelle
Mit einem Klick auf die Schaltfläche können Sie den Text des Textfelds anhand der for-Schleife überprüfen:
quelle
Einfachere Antwort:
quelle