| 

.NET C# Java Javascript Exception

1
Ich möchte hier nochmal meine Frage stellen, nach dem ich schon den einen oder anderen guten Hinweis bekommen habe - nur leider komm ich nicht auf eine zufriedenstellende Lösung.

Wir haben in einer WindowsForm eine Eingabemaske. Diese beinhaltet verschiedene Textboxen. Wir benutzen eigens erweiterte Textboxen.

Damit eine Änderung innerhalb der Textbox auch SOFORT in die DB (MSSQL) geschrieben wird, haben wir auf das TextChanged-Event folgenden Code geschrieben:

Private Sub FXDBTextBox_TextChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.TextChanged

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

End Sub


Bei Texten und Ganzzahlen funktioniert dass alles sehr gut. Will ich nun nun eine Dezimalzahl eingeben und benutze "," oder "." als Trennzeichen, "springt" der Eingabecursor immer an die erste Stelle der Box und das Trennzeichen wird nicht übernommen.

Daher haben wir folgenden Code im Parse-Event der Textbox eingefügt:

Dim binding As Binding = CType(sender, Binding)
If (Not (binding) Is Nothing) Then
Dim txt As TextBox = CType(binding.Control, TextBox)
If (Not (txt) Is Nothing) Then

' Berücksichtigung von Dezimalzahlen und ihre korrekte Übergabe an die
' BindingSource
If e.DesiredType.FullName = "System.Decimal" = True Then

Dim _ValidDecimal As Decimal

If Decimal.TryParse(e.Value.ToString, _ValidDecimal) = True Then
e.Value = _ValidDecimal
End If

End If
End If

End If


Leider war das nicht hilfreich.

Es scheint immer noch an der Valiedierung der Dezimalzahl zu liegen, bevor sie an die Datenquelle geschrieben wird.

Wie gesagt: Der Benutzer soll in der lage sein, den Wert zu ändern, OHNE dass er die Textbox VERLASSEN muss.

Welchen Ansatzt muss ich hier noch einfügen, damit das funktioniert?
21.03.2011
MyKey0815 1,6k 2 9
3 Antworten
1
Zunächst: wenn der DataSourceUpdateMode Deines Bindings auf OnPropertyChanged statt OnValidation steht, sollte der TextChanged-Handler überflüssig sein.

Ansonsten sieht Dein Parse-Event-Handler unvollständig aus

Wenn ConvertEventArgs im Parse-Ereignis zurückgegeben wird, enthält die Eigenschaft den vom Benutzer formatierten Wert des datengebundenen Steuerelements. Im Parse-Ereignis müssen Sie den formatierten Wert lesen, analysieren und in den gleichen Datentyp wie die Datenquelle zurückkonvertieren. Anschließend können Sie die Value-Eigenschaft auf den Rohwert zurücksetzen und so den Wert der Datenquelle festlegen. Überprüfen Sie den DesiredType-Eigenschaftenwert, um den Typ der Datenquelle zu bestimmen.

Quelle: MSDN

Du mußt Dich also auch im Fall, dass gerade kein parsebarer Wert in Value steht, darum kümmern, dass etwas vom DesiredType in Value hineingeschrieben wird - oder eine Exception werfen.
21.03.2011
Matthias Hlawatsch 13,2k 4 9
1
Das Problem mit dem Dezimaltrennzeichen ist darin begründet, dass die Datenquelle mit eine Zahl ohen Nachkommaanteil aktualisiert wird (123, == 123,00). Nachdem die Datenquelle aktualisiert wurde, sorgt die Datenbindung dafür, dass auch das Textfeld wieder aktualisiert wird. Das Textfeld verwendet für die Anzeige die Methode ToString(). Und diese wiederum verwendet bei Decimal- und Double-Werten den Standardformatierer "G". Daher wird das Komma auch entfernt, wenn der Nachkommaanteil 0 ist.

Es sollte das Textfeld selbst überprüft werden (TryParse() scheint hier ja nicht zu helfen). Wenn das letzte Zeichen ein Dezimaltrennzeichen ist, darf die Datenquelle nicht aktualisiert werden.

Wenn das noch immer nicht weiterhilft, würde ich mal eine Lösung ohne Datenbindung probieren. Die Quelle wird ja sowieso schon programmatisch gefüllt. Lediglich die Aktualsisierung der TextBox muss dann für Steuerelemente mit Kommazahlen noch zusätzlich implementiert werden.
21.03.2011
Andreas Ganzer 1,4k 1 8
0
Eine - vielleicht seltsame anmutende - Methode wäre, über einen Extender der Textbox eine Property: "BindableDecimalValue" anzufügen (muss natürlich im Change event immer schön "richtig" befüllt werden). Hat mir mal gute Dienste geleistet.
21.03.2011
nabuchodonossor 1,3k 5

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH