WPF Textbox nur Zahlen



  • Hallo zusammen.

    Was ist die einfachste bzw. beste Möglichkeit die Eingabe einer Textbox nur auf Zahlen zu begrenzen.

    Ich dachte ich löse das über ExceptionValidationRule
    doch ich weiß nicht wie ich überprüfe ob die Eingabe eine Zahl ist.

    Denn ich habe die Textbox an eine int Property gebunden. Hier komme ich nun gar nicht in den Setter rein um eine Exception zu werfen.





  • Danke mal für deine Antwort.

    Auch wenn ich gerne mal gewußt hätte wie das mit ExceptionValidationRule funktioniert.

    Deine Klasse funktioniert bei mir noch nicht. Er kennt den Typ oder Namespace NumberTypes nicht. Fehlt da noch was?



  • Geh ein Verzeichnis höher und du siehst sie da liegen
    https://github.com/DavidWDev/DW.WPFToolkit/tree/master/DW.WPFToolkit/NumberBox

    Tja - selbst Copy & Paste kann nicht jeder 😃



  • Wenn ich den Wert an eine Property binde und die Property mit einem Wert fülle die ausserhalb des Maximums liegt, zeigt die NumberBox den Wert an. Und zeigt nicht dass es ein Fehler ist.



  • Die Box fängt nur Benutzereingaben ab, sodass du gar nicht mehr Eingeben kannst als das Maximum.
    Wenn du es im Code setzt wird das natürlich nicht abgefangen, da musst du einfach wissen was du tust.



  • Schön.

    Aber vieleicht kann mir noch jemand sagen wie ich das mit den ExceptionValidationRules mache



  • ist in der MSDN gut Dokumentiert.
    http://msdn.microsoft.com/de-de/library/system.windows.controls.exceptionvalidationrule.aspx
    Auch Google wird dir einige Ergebnisse liefern.
    Etwas mehr Eigeninitiative bitte.



  • Ja im allgemeinen habe ich das auch verstanden.
    Habe auch schon Beispiele gefunden. Die funktionieren auch bei mir.

    Doch wie gesagt weiß ich nicht wie ich das löse wenn etwas anderes als eine Zahl eingegeben wird.

    Habe ich ja in meinem ersten Post geschrieben:

    Denn ich habe die Textbox an eine int Property gebunden. Hier komme ich nun gar nicht in den Setter rein um eine Exception zu werfen.



  • Wenn du die Property gebunden hast, musst du das Textfeld erst verlassen bevor die ValidationRule greift. Standard für den UpdateSourceTrigger von TextBoxen ist nämlich "LostFocus" und nicht "PropertyChanged".



  • Ne simple Lösung ist doch auf jedes Event der Änderung des Textes des Textbox zu reagieren, den String auszulesen alle Zeichen außer Zahlen zu entfernen den String zurückschreiben und den Courser wieder ans Ende zu setzen. Das funktioniert recht gut.

    this.textBox1.TextChanged += new TextChangedEventHandler(this.textBox1_TextChanged);
    
    // Eingaben von Zeichen außer Zahlen verhindern
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                // Lese den Text String der Textbox aus und entferne alle Zeichen außer Zahlen
                // Die Angabe was entfernt werden soll geschieht mit regulären Ausdrücken
                string help1 = Regex.Replace((this.textBox1.Text), @"\D", "");
                // Setze den so bereinigten Text zurück in die Textbox
                this.textBox1.Text = help1;
                //Setze den Courser ans Ende des bereinigten Strings in der Textbox
                this.textBox1.CaretIndex = help1.Length;
            }
    

    Vor 2 Wochen konnte ich kein Stück C# und kein .NET und die Lösung habe ich jetzt in 10 Minuten hinbekommen 😃



  • @Andreas XXL

    Jo das hätte ich auch hinbekommen. Aber das ist keine schöne Lösung. Und erst recht nicht MVVM like.



  • ChickenWing schrieb:

    @Andreas XXL

    Jo das hätte ich auch hinbekommen. Aber das ist keine schöne Lösung. Und erst recht nicht MVVM like.

    Funktioniert aber :p. Es ist nichtmal ein Aufblitzen des falschen Buchstabens oder so zu sehen.



  • MVVM Like ist es wenn du das Verhalten einfach in eine TextBox ableitung machst, ein Custom Control -> Und dann bist du wieder bei dem Control von mir 😉
    (Ein AttachedBehavior tut es aber auch, wenn du keine Ableitung willst.)

    @Andreas XXL
    In deiner Lösung musst du nur noch den CaretIndex vorher merken, dann kannst du ihn neu setzen, dadurch springt der Curser nicht immer ans Ende wenn man im Text etwas ändert oder pastet.

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        var oldIndex = textBox1.CaretIndex;
        var help1 = Regex.Replace((textBox1.Text), @"\D", "");
        textBox1.Text = help1;
        textBox1.CaretIndex = help1.Length > oldIndex ? oldIndex : help1.Length; 
    }
    

    Schwieriger ist es nur wenn man noch Minimum, Maximum, Dezimalstellen sowie Negative Werte erlauben möchte.



  • David W schrieb:

    MVVM Like ist es wenn du das Verhalten einfach in eine TextBox ableitung machst, ein Custom Control -> Und dann bist du wieder bei dem Control von mir 😉
    (Ein AttachedBehavior tut es aber auch, wenn du keine Ableitung willst.)

    @Andreas XXL
    In deiner Lösung musst du nur noch den CaretIndex vorher merken, dann kannst du ihn neu setzen, dadurch springt der Curser nicht immer ans Ende wenn man im Text etwas ändert oder pastet.

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        var oldIndex = textBox1.CaretIndex;
        var help1 = Regex.Replace((textBox1.Text), @"\D", "");
        textBox1.Text = help1;
        textBox1.CaretIndex = help1.Length > oldIndex ? oldIndex : help1.Length; 
    }
    

    Schwieriger ist es nur wenn man noch Minimum, Maximum, Dezimalstellen sowie Negative Werte erlauben möchte.

    Danke!

    Daran hatte ich noch nicht gedacht.


Anmelden zum Antworten