Ungültige Konvertierung von der Zeichenfolge in Typ Double

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Loonix.

    Ungültige Konvertierung von der Zeichenfolge in Typ Double

    Hallo =)
    Hier ist malwieder ein totaler VB Neuensteiger, entsprechend ich meine Frage vermutlich. Auch wenn ich über Google und die Board suche nicht fündig geworden bin =(

    Ich habe ein Progrämmchen geschrieben das Mehrere text eingabefelder enthält, diese dürfen jedoch nur zahlen enthalten und nicht leer sein. Das hat auch wunderbar geklappt.
    Auch das berechnen sobald ich aus dem Fenster tabbe klappt gut mit .LostFocus. Aber das müsste doch auch mit .TextChanged funktionieren oder?
    wenn ich jedoch dies jedoch verwende erhalte ich die meldung :Ungültige Konvertierung von der Zeichenfolge in Typ Double...
    und kann ums verzweifeln nicht herausfinden, warum
    Hier das Beispiel an dem mich der Debugger herauswirft:

    Quellcode

    1. Private Sub RatteZahl_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RatteZahl.TextChanged
    2. KeineNull = RatteZahl.Text
    3. Nuller()
    4. RatteZahl.Text = KeineNull
    5. ViechSummen()
    6. End Sub


    Könnt ihr mir helfen?
    Dank im vorraus,
    Loonix
    Hi!

    Das klingt so, als würde während dem tippen (z.B. löschen) kurzzeitig der inhalt der textbox keine zahl sein...

    Und mit deinem Quellcode kann man echt nix anfangen... was für ein Variablentyp hat "Keine Null" und was macht die Funktion Nuller (Quellcode) und was macht die Funktion "ViechSummen"?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    *oups* entschuldige, ich hoffe so kommentiert wird eher ein schuh draus:

    Quellcode

    1. Dim KeineNull As Integer '* Um leere Eingabefelder abzufangen wird deren Inhalt an diese Variable gegeben, geprüft, gegebenenfalls geändert und zurückgegeben.
    2. Private Sub RatteZahl_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RatteZahl.LostFocus '* Mit .LostFocus gibt es keine probleme. sobald ich auf .TextChanged stelle erhalte ich den Fehler
    3. '* Hier wird sichergestellt das das feld vorm tabben nicht leer ist
    4. KeineNull = Int(RatteZahl.Text) '* Textfeld in eine Variable auslesen
    5. Nuller() '* Variable übergeben die schaut ob die Variable leer ist
    6. RatteZahl.Text = Int(KeineNull) '* wieder zurück in das Textfeld schreiben
    7. ViechSummen() '* Hier werden die Zahlen in eine funktion geschrieben die viele felder, ähnlich diesem, zusammen zählen, alles Integer
    8. End Sub
    9. Private Sub RatteZahl_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles RatteZahl.KeyPress
    10. '* Hier wird sichergestellt das nur Ziffern eingegeben werden
    11. Ziffern(e)
    12. End Sub
    13. Private Sub Nuller()
    14. '* Funktion zum vermeiden leerer Eingabefelder!
    15. If KeineNull = "" Then
    16. KeineNull = "0"
    17. End If
    18. End Sub
    19. Private Sub Ziffern(ByVal e)
    20. '* Diese Funktion erlaubt nur Numerische Eingaben!!
    21. Const Numbers$ = "0123456789."
    22. If Asc(e.KeyChar) <> 8 Then
    23. If InStr(Numbers, Chr(Asc(e.KeyChar))) = 0 Then
    24. e.Handled = True
    25. Exit Sub
    26. End If
    27. End If
    28. End Sub


    Und du hast Recht, wenn ich die eingabe lösche ist sie kurzzeitig leer.
    Bis zu einer eingabe komme ich jedoch bei der textchanged version nicht, da er die Eingabemaske garnicht erst aufbaut. =(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Loonix“ ()

    ich seh da gleich nen haufen fehler ^^

    also... KeineNull müsste auf deine art jeden fall mal als String dekleriert werden, da du ja einen string rein ladest...
    Die funktion Int schneidet nachkommastellen von einer ZAHL ab, dies ja in deinem Fall noch nich gibt. wir sind da noch immer bei strings.
    Die Funktion Nuller kannst du weg lassen, das geht mit IsNumeric viel einfacher.

    RatteZahl.Text = Int(KeineNull)
    ist auf jeden fall blödsinn, wenn du mit der Zahl weiterrechnest.
    Bei der Sub Ziffern solltest du für e einen Typ angeben.
    in diesem fall System.Windows.Forms.KeyPressEventArgs

    Also all in all müsste das in etwa so aussehen:

    Quellcode

    1. Dim Zahl As Integer '* Um leere Eingabefelder abzufangen wird deren Inhalt an diese Variable gegeben, geprüft, gegebenenfalls geändert und zurückgegeben.
    2. Private Sub RatteZahl_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RatteZahl.LostFocus '* Mit .LostFocus gibt es keine probleme. sobald ich auf .TextChanged stelle erhalte ich den Fehler
    3. '* Hier wird sichergestellt das das feld vorm tabben nicht leer ist
    4. If IsNumeric(RatteZahl.Text) then
    5. Zahl = Int(val(RatteZahl.Text))
    6. Else
    7. Zahl = 0
    8. End if
    9. ViechSummen() '* Hier werden die Zahlen in eine funktion geschrieben die viele felder, ähnlich diesem, zusammen zählen, alles Integer
    10. End Sub
    11. Private Sub RatteZahl_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles RatteZahl.KeyPress
    12. '* Hier wird sichergestellt das nur Ziffern eingegeben werden
    13. Ziffern(byref e System.Windows.Forms.KeyPressEventArgs)
    14. End Sub
    15. Private Sub Ziffern(ByVal e as System.Windows.Forms.KeyPressEventArgs)
    16. '* Diese Funktion erlaubt nur Numerische Eingaben!!
    17. Const Numbers$ = "0123456789."
    18. If Asc(e.KeyChar) <> 8 Then
    19. If InStr(Numbers, Chr(Asc(e.KeyChar))) = 0 Then
    20. e.Handled = True
    21. Exit Sub
    22. End If
    23. End If
    24. End Sub


    In Viecher summonen verwendest du dann die Variable Zahl ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    *grübel grübel*
    *wühl wühl*

    Vielen Dank für die Mühe, das muss ich ersteinmal ausprobieren =)
    Meine Güte, zumindest kann ich sachen RICHTIG falsch machen *g*

    das mit der Nuller() funktion hätte ich echt sehen müssen!

    Int(Val(x)) Lässt nun auch komma zahlen zu?
    Ich muss mehr lesen ^^
    Hi!

    Also:
    Val verwandelt Variablen/Strings, die das Format einer Gültigen Zahl haben (also entweder USA-Norm (123.321) oder Landeseinstellungen (123,321)) in eine Zahl; int wirst du wohl wissen, was es bringt...
    Mit IsNumeric Prüfst du ob eine Variable/ein String das Format einer Gültigen Zahl hat (siehe oben).

    Also: Wenn der String keine Zahl ist, wird die Variable auf 0 gesetzt, wenns eine Zahl ist wird der String zu einem Int verwandelt.

    Und ich hab nen kleine Fehler gemacht:
    Beim Keypress soll natürlich nicht ByRef e as ... stehen, sondern nur e.
    War gestern wohl ein bisschen müde *g*
    juhu!
    nun habe ich das Programmierbügeleisen kräftig über meinen Code gleiten lassen =)

    Die wichtigsten Lehren die ich gezogenhabe sind:
    Rechne NIE mit dem Inhalt von Eingabefeldern!
    Übergib JEDE Eingabe in eine Variable!
    Deklariere alle Variablen EIN-EINDEUTIG!

    Mad Andy, danke das du mir geholfen hast,
    es hat sehr geholfen =)