Autor |
Beitrag |
PeterRRR
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 23.09.09 09:04
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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mi 23.09.09 09:33
Hallo Peter und
Dafür ist die MaskedTextBox vorgesehen, bei der geht es mit einer passenden Mask-Vorgabe.
Jürgen
|
|
PeterRRR 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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!
Danke und liebe Grüße
Peter
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
|
|
PeterRRR 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.).
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; } |
Zuletzt bearbeitet von Ralf Jansen am Mi 23.09.09 16:21, insgesamt 2-mal bearbeitet
|
|
PeterRRR 
Hält's aus hier
Beiträge: 5
|
Verfasst: Mi 23.09.09 16:14
Vielen, vielen Dank, genau so eine Lösung hab ich gesucht!
Ich wusst nicht, dass man auf das NumericUpDown auch wie auf eine Textbox zugreifen kann.
Danke nochmal!
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
|
|