Ich habe ein Benutzersteuerelemt auf Basis der Textbox erstellt. Dies soll in der Lage sein, wenn sich der wert darin ändert und das Steuerelement datengebunden ist, dass der Inhalt gleich in die Datenquelle (MS-SQL Server) geschrieben wird.
Dazu habe ich folgende Code implementiert:
If _AutoWriteValue = True Then ' Damit verhindern wir beim Schließen eines Moduls/Steuerelements, das der Wert ' erneut geschrieben werden soll und es daher zu einer Execption kommt If Me.Focused = True Then For Each obj As Binding In Me.DataBindings obj.WriteValue() Next End If End If
Solange es "normale" Werte und Strings sind, die geschrieben werden, ist diese Methode ausreichend und funktionell.
Nun habe ich aber eine Tabelle, in der Dezimalzahlen (3,14 oder 100,478) gespeichert werden.
Solange ich die Ganzzahl eingebe, passt es noch. Trage ich ein Komma/Punkt ein, dann springt der Cursor an die erste Stelle in der Textbox.
Ich kann zwar nicht verstehen, warum es notwendig ist, jeden Tastendruck sofort in der Datenbank zu speichern, aber trotzdem:
Das Problem bei diesem Vorgehen ist, dass ungültige Zeichenfolgen in die Datenquelle geschrieben werden sollen. Z.B.: Wenn ein Komma eingegeben wird, sollte man den Wert noch nicht schreiben, sondern erst dann, wenn auch wenigsten eine Nachkommastelle vorhanden ist. Vielleicht ist es sinnvoll, den Wert zunächst mit double.TryParse() bzw. decimal.TryParse() zu evaluieren?
Ich habe allerdings nicht ausprobiert, ob eine bestimmte Formatierung der Felder (z.B. zugewiesene ###0.## usw.) dem nicht wieder einen Strich durch die Rechnung machen.
Also, vielen Dank für deinen Hinweis mit der Valiedierung.
Warum ich nach jedem Textänderung in die DB schreibe, liegt darin, dass wir nicht möchten, dass der Benutzer erst aus dem Textfeld raus muss um dann speichern zu können - vorher reagiert ja die BindingSource nicht auf die Änderung.
Hab jetzt noch das Problem, dass ich eine Logik finden möchte, die für Textfelder UND Decimalfelder funktioniert. Muss wohl eine zusätzliche Eigenschaft bauen, die die Auswertung von "," und/oder "." aktiviert, oder?
Das mit der Eigenschaft scheint mir ganz sinnvoll zu sein. Da es ein Benutzersteuerelement ist, sehe ich da auch keinen besseren Weg (alternativ könnte man auch mehrere Benutzersteuerelemente von einer gemeinsamen Basis ableiten, wobei jedes Element für bestimmte Typen zuständig ist; aber das könnte an dieser Stelle auch zu viel des Guten sein).
Warum ich nach jedem Textänderung in die DB schreibe, liegt darin, dass wir nicht möchten, dass der Benutzer erst aus dem Textfeld raus muss um dann speichern zu können - vorher reagiert ja die BindingSource nicht auf die Änderung.
Hab jetzt noch das Problem, dass ich eine Logik finden möchte, die für Textfelder UND Decimalfelder funktioniert. Muss wohl eine zusätzliche Eigenschaft bauen, die die Auswertung von "," und/oder "." aktiviert, oder?