Entwickler-Ecke
WinForms - TextBox bzw. NumericUpDown formatieren
PeterRRR - Mi 23.09.09 09:04
Titel: TextBox bzw. NumericUpDown formatieren
Hallo!
Ich möchte ein NumericUpDown bzw. eine Textbox formatieren. Und zwar soll bei beiden nur eine Zahl mit maximal zwei Nachkommastellen und vier Stellen vor dem Komma eingegeben werden können. Die höchste Zahl wäre somit 9999,99, die niedrigste 0,00
Buchstaben und andere Zeichen außer genau einem einzigen Komma-Zeichen sollen gar nicht erst angenommen werden.
Beim NumericUpDown kann man ja einstellen, dass nur zwei Nachkommastellen gelten sollen bzw. auch einen Minimum- und Maximum-Wert. Trotzdem können beispielsweise mehr als zwei Nachkommastellen eingegeben werden, sobald man allerdings auf einen Button oder ähnliches klickt wird auf zwei Stellen gekürzt, wobei das Ergebnis dabei aber gerundet wird, wie mir aufgefallen ist. Ich möchte es aber so, dass gar nicht erst mehr Stellen eingegeben werden können, d.h. sind bereits zwei Nachkommastellen vorhanden und der Benutzer möchte eine dritte hinzufügen, wird die Eingabe gar nicht ins Feld geschrieben, etwa so, wie wenn man versucht Buchstaben ins NumericUpDown einzutippen (was ja schon standardmäßig nicht funktioniert).
Dasselbe möchte ich auch für eine TextBox realisieren.
Nur wie? Wer kann weiterhelfen?
Danke und liebe Grüße
Peter
JüTho - Mi 23.09.09 09:33
Hallo Peter und :welcome:
Dafür ist die MaskedTextBox vorgesehen, bei der geht es mit einer passenden Mask-Vorgabe.
Jürgen
PeterRRR - Mi 23.09.09 10:08
Dankeschön!
Hast du vl. auch noch eine Lösung für das NumericUpDown - dann wäre es wirklich perfekt! :D
Danke und liebe Grüße
Peter
JüTho - Mi 23.09.09 11:52
Nein, ich würde es mit den Validated/ing-Ereignissen probieren, vielleicht i.V.m. UpdateEditText-Methode. Jürgen
PeterRRR - Mi 23.09.09 13:14
Mit UpdateEditText hab ich es schon probiert, aber meinem Verständnis nach tritt dieses Ereignis erst dann auf, wenn der Wert ("Value") bereits gesetzt wurde und dann ist es ja bereits zu spät. Ich will ja den Wert gar nicht erst setzen, wenn die Eingabe nicht den Vorgaben entspricht. D.h. ich will Falschangaben gar nicht zulassen, ein falscher Wert kann dann also niemals gesetzt werden.
Ralf Jansen - Mi 23.09.09 14:09
Da wirst du wohl KeyPress behandeln müssen. Und je nachdem ob der dort ankommende Key in dein Konzept passt oder nicht diesen verwerfen.
Es würde sich anbieten dazu ein abgeleitetes eigenes Control zu erstellen. Für das NumericUpDown Control habe ich gerade kein Beispiel aber für Textboxen bei denen es genauso funktioniert gibt es reichlich. Zum Beispiel das
hier [
http://dotnet-snippets.de/dns/numerische-textbox-SID990.aspx].
PeterRRR - Mi 23.09.09 14:20
Ja, an KeyPress hab ich auch schon als erstes gedacht, nur das Problem dabei ist: wie finde ich raus, an welcher Position im NumericUpDown-Feld das Zeichen eingegeben wird?
Wenn ich jetzt nämlich nur zwei Nachkommastellen erlauben will, muss ich ja bei einer eingegebenen Ziffer wissen, ob die Ziffer VOR oder NACH dem Komma eingegeben wurde und dazu benötige ich die Position des Text-Cursors im Numeric-Feld.
Ralf Jansen - Mi 23.09.09 15:27
Dann wirds komplizierter wenn du das berücksichtigen willst.
Ich würde vorschlagen in einem abgeleiteten NumericUpDown on OnTextBoxKeyPress zu überschreiben.
In dieser Methode hast du Zugriff auf den Textbox Teil des Controls und kannst über die Textbox dann auf die Caret Position zugreifen.
Ich habe das mal schnell ausprobiert. Funktioniert vordergründig, siehe Code. Die ganzen sonstigen Fallstricke müsstest du noch ausarbeiten(Copy&Paste, Tausender Trennzeichen etc.).
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| protected override void OnTextBoxKeyPress(object source, System.Windows.Forms.KeyPressEventArgs e) { base.OnTextBoxKeyPress(source, e); if (e.Handled) return;
string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
if (!char.IsNumber(e.KeyChar) && !e.KeyChar.ToString().Equals(decimalSeparator)) { e.Handled = char.IsLetter(e.KeyChar) || char.IsPunctuation(e.KeyChar); return; }
TextBox innerTextBox = source as TextBox; string previewString = innerTextBox.Text.Insert(innerTextBox.SelectionStart, e.KeyChar.ToString()); double previewValue;
if (double.TryParse(previewString, out previewValue)) { int index = previewString.IndexOf(decimalSeparator); if (index == -1) { e.Handled = false; } else { int decPlaces = previewString.Length - (index + decimalSeparator.Length); e.Handled = decPlaces > this.DecimalPlaces; } } else e.Handled = true; } |
PeterRRR - Mi 23.09.09 16:14
Vielen, vielen Dank, genau so eine Lösung hab ich gesucht! :dance2:
Ich wusst nicht, dass man auf das NumericUpDown auch wie auf eine Textbox zugreifen kann.
Danke nochmal!
Ralf Jansen - Mi 23.09.09 16:28
Zitat: |
Ich wusst nicht, dass man auf das NumericUpDown auch wie auf eine Textbox zugreifen kann. |
Das kann man auch nicht. Ein NumericUpDown ist keine Textbox. Aber intern verwaltet es (unter anderem) eine Textbox und an ein paar stellen(zum Beispiel OnTextBoxKeyPress) kommt man da über Umwege daran.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!