Fehlermeldung bei einfachem Prozentrechner in VB 2010 (Ungültige Konvertierung von der Zeichenfolge in Typ Double).

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Die wollte ich ja einfügen mit Hilfe der vorigen Antworten.
    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim text = "123,456" ' "Bockwurst mit Senf"
    2. Dim dd As Double = 0
    3. If Not Double.TryParse(text, dd) Then
    4. MessageBox.Show("Das war wohl nix")
    5. Return
    6. End If
    7. MessageBox.Show(dd.ToString)


    klar müssen die Deklarationen vor die Subs. Dann fragte ich, ob ich jedes Mal in jeden Private Sub

    VB.NET-Quellcode

    1. If Not Double.TryParse(Text, dd) Then
    2. MessageBox.Show("Das war wohl nix")
    3. Return
    4. End If

    eingeben soll. Als ich das getan habe kam, egal was ich eingegeben habe die Messagebox.
    Und so wusste ich nicht weiter.
    In Post #22 hatte ich dir geschrieben, dass es mehrere Möglichkeiten gibt, wie man da vorgehen könnte...

    Auch wenn's eine kleine Anwendung ist, solltest du dir zuerst eine Struktur des Programms zurechtlegen:

    Wie soll die Eingabe erfolgen:
    über TextBoxen:
    Dann muss zuerst eine Validierung aller Werteingaben vor der Wertzuweisung zu den Variablen erfolgen (siehe Post #19)
    Wann soll die Eingabe-Prüfung passieren:
    • sofort während der Eingabe (Box kann nur bei einer gültiger Eingabe verlassen werden)
    • nach Verlassen der Eingabebox mit Meldung (wenn nicht Ok zurück zur Box oder Abbruch)
    • oder willst du einen Errorprovider für die TextBoxen benutzen, der dir Eingabefehler anzeigt?
    • oder noch was anderes?
    über NUD's ist keine Validierung notwendig - da kannst du sofort die Eingabe der Variable zuweisen!

    Und jetzt erst kannst du mit den gefütterten Variablen Berechnungen durchführen...

    Als Nächstes überlegen, wie die Ergebnisse ausgegeben werden sollen...

    Dein Vorhaben jetzt Schritt für Schritt umsetzen! (Bei Ungereimtheiten gezielte Fragen stellen...)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VB1963“ ()

    Ich habe mir mal für den Threadersteller die Mühe gemacht, den Code auf Option Strict On anzupassen. Außerdem stürzt es jetzt nicht mehr ab. Die Programmlogik sowie die Controls habe ich nicht verändert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim G, P, W As Double
    4. Private Sub cmdp_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdP.Click
    5. If txtp.Text = String.Empty Then
    6. txtp.Text = "0"
    7. Else
    8. txtp.Text = txtp.Text
    9. End If
    10. If txtw.Text = String.Empty Then
    11. txtw.Text = "0"
    12. Else
    13. txtw.Text = txtw.Text
    14. End If
    15. If txtg.Text = String.Empty Then
    16. txtg.Text = "0"
    17. Else
    18. txtg.Text = txtg.Text
    19. End If
    20. Double.TryParse(txtw.Text, W)
    21. Double.TryParse(txtg.Text, G)
    22. lblp.Text = ((W / G) * 100 - 100).ToString & "%"
    23. End Sub
    24. Private Sub cmdw_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdw.Click
    25. If txtw.Text = String.Empty Then
    26. txtw.Text = "0"
    27. Else
    28. txtw.Text = txtw.Text
    29. End If
    30. If txtp.Text = String.Empty Then
    31. txtp.Text = "0"
    32. Else
    33. txtp.Text = txtp.Text
    34. End If
    35. If txtg.Text = String.Empty Then
    36. txtg.Text = "0"
    37. Else
    38. txtg.Text = txtg.Text
    39. End If
    40. Double.TryParse(txtp.Text, P)
    41. Double.TryParse(txtg.Text, G)
    42. lblw.Text = (G * (P + 100) / 100).ToString
    43. End Sub
    44. Private Sub cmdg_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdg.Click
    45. If txtg.Text = String.Empty Then
    46. txtg.Text = "0"
    47. Else
    48. txtg.Text = txtg.Text
    49. End If
    50. If txtp.Text = String.Empty Then
    51. txtp.Text = "0"
    52. Else
    53. txtp.Text = txtp.Text
    54. End If
    55. If txtw.Text = String.Empty Then
    56. txtw.Text = "0"
    57. Else
    58. txtw.Text = txtw.Text
    59. End If
    60. Double.TryParse(txtp.Text, P)
    61. Double.TryParse(txtw.Text, W)
    62. lblg.Text = (W / ((P + 100) / 100)).ToString
    63. End Sub
    64. End Class



    Und hier noch die verbesserte Variante mit NumericUpDown's:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form2
    3. Private Sub NumericUpDownp_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDownp.ValueChanged, NumericUpDowng.ValueChanged, NumericUpDownw.ValueChanged
    4. Try
    5. lblp.Text = ((NumericUpDownw.Value / NumericUpDowng.Value) * 100 - 100).ToString & "%"
    6. lblw.Text = (NumericUpDowng.Value * (NumericUpDownp.Value + 100) / 100).ToString
    7. lblg.Text = (NumericUpDownw.Value / ((NumericUpDownp.Value + 100) / 100)).ToString
    8. Catch ex As Exception
    9. End Try
    10. End Sub
    11. End Class


    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^

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

    Vielen Dank Mikro Fahrrad,

    mit NumericUpDown ist es ja wirklich viel einfacher. Ich hatte es nur nicht gewählt, weil ich damit noch nie gearbeitet habe und so auf bekanntes zurückgreifen wollte.

    (Noch nicht ganz verstanden habe ich, weshalb ich für den Grundwert keine höhere Zahl, als 100 eingeben kann (es springt sofort zurück auf 100).)

    Schon gut hats sich erledigt.
    Ein Blick in die Eigenschaften würde auch helfen :S
    Wie ich oben schon erwähnt habe - dafür gibt es mehrere Möglichkeiten:
    Siehe folgende Snippets zum Probieren...

    Wertkonvertierung unmittelbar vor einer Berechnung

    VB.NET-Quellcode

    1. Option Strict On
    2. ''' <summary>
    3. ''' Wertkonvertierung unmittelbar vor einer Berechnung
    4. ''' </summary>
    5. Public Class Form1
    6. Private G, P, W As Double
    7. Private Sub Button_Click(sender As Object, e As EventArgs) Handles cmdG.Click, cmdW.Click, cmdP.Click
    8. If ConvertAllValues() Then
    9. Select Case True
    10. Case sender Is cmdP
    11. lblP.Text = (W / G).ToString("P2")
    12. Case sender Is cmdW
    13. lblW.Text = (G * P / 100).ToString("F2")
    14. Case sender Is cmdG
    15. lblG.Text = (W / P * 100).ToString("F2")
    16. End Select
    17. Else
    18. MessageBox.Show("Eingabe-Fehler!")
    19. End If
    20. End Sub
    21. Private Function ConvertAllValues() As Boolean
    22. Dim cG = Double.TryParse(txtG.Text, G)
    23. Dim cP = Double.TryParse(txtP.Text, P)
    24. Dim cW = Double.TryParse(txtW.Text, W)
    25. Return (cG AndAlso cP AndAlso cW)
    26. End Function
    27. End Class

    Konvertierung wird nach der Eingabe im Feld angezeigt

    VB.NET-Quellcode

    1. Option Strict On
    2. ''' <summary>
    3. ''' Konvertierung wird nach der Eingabe im Feld angezeigt
    4. ''' </summary>
    5. Public Class Form1
    6. Private G, P, W As Double
    7. Private Sub Button_Click(sender As Object, e As EventArgs) Handles cmdG.Click, cmdW.Click, cmdP.Click
    8. Select Case True
    9. Case sender Is cmdP
    10. lblP.Text = (W / G).ToString("P2")
    11. Case sender Is cmdW
    12. lblW.Text = (G * P / 100).ToString("F2")
    13. Case sender Is cmdG
    14. lblG.Text = (W / P * 100).ToString("F2")
    15. End Select
    16. End Sub
    17. Private Sub txtG_Validated(sender As Object, e As EventArgs) Handles txtG.Validated, txtW.Validated, txtP.Validated
    18. Select Case True
    19. Case sender Is txtP
    20. Double.TryParse(DirectCast(sender, TextBox).Text, P)
    21. txtP.Text = P.ToString
    22. Case sender Is txtW
    23. Double.TryParse(DirectCast(sender, TextBox).Text, W)
    24. txtW.Text = W.ToString
    25. Case sender Is txtG
    26. Double.TryParse(DirectCast(sender, TextBox).Text, G)
    27. txtG.Text = G.ToString
    28. End Select
    29. End Sub
    30. End Class

    eine gültige Eingabe muss unbedingt erforderlich sein

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. ''' <summary>
    4. ''' eine gültige Eingabe muss unbedingt erforderlich sein
    5. ''' sonst wird die Anwendung geschlossen!
    6. ''' </summary>
    7. Public Class Form1
    8. Private G, P, W As Double
    9. Private Sub Button_Click(sender As Object, e As EventArgs) Handles cmdG.Click, cmdW.Click, cmdP.Click
    10. Select Case True
    11. Case sender Is cmdP
    12. lblP.Text = (W / G).ToString("P2")
    13. Case sender Is cmdW
    14. lblW.Text = (G * P / 100).ToString("F2")
    15. Case sender Is cmdG
    16. lblG.Text = (W / P * 100).ToString("F2")
    17. End Select
    18. End Sub
    19. Private Sub Textbox_Validating(sender As Object, e As CancelEventArgs) Handles txtG.Validating, txtW.Validating, txtP.Validating
    20. Dim Result As Double
    21. Dim tbx = DirectCast(sender, TextBox)
    22. If Not Double.TryParse(tbx.Text, Result) Then
    23. If MessageBox.Show("Wollen Sie Ihre Eingabe überarbeiten?", "Eingabe-Fehler!", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then Application.Exit()
    24. e.Cancel = True
    25. tbx.Select(0, tbx.Text.Length)
    26. End If
    27. If sender Is txtP Then P = Result
    28. If sender Is txtW Then W = Result
    29. If sender Is txtG Then G = Result
    30. End Sub
    31. End Class

    Fehler von einem Errorprovider anzeigen lassen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. ''' <summary>
    4. ''' Werkonvertierung geschieht direkt im TextBox.Validating/Validated-Event
    5. ''' hier werden Fehler von einem Errorprovider angezeigt
    6. ''' </summary>
    7. Public Class Form1
    8. Private G, P, W As Double
    9. Private errProvider As New ErrorProvider
    10. Private Sub Button_Click(sender As Object, e As EventArgs) Handles cmdG.Click, cmdW.Click, cmdP.Click
    11. Select Case True
    12. Case sender Is cmdP
    13. lblP.Text = (W / G).ToString("P2")
    14. Case sender Is cmdW
    15. lblW.Text = (G * P / 100).ToString("F2")
    16. Case sender Is cmdG
    17. lblG.Text = (W / P * 100).ToString("F2")
    18. End Select
    19. End Sub
    20. Private Sub Textbox_Validating(sender As Object, e As CancelEventArgs) Handles txtG.Validating, txtW.Validating, txtP.Validating
    21. Dim Result As Double
    22. Dim tbx = DirectCast(sender, TextBox)
    23. If Not Double.TryParse(tbx.Text, Result) Then
    24. e.Cancel = True
    25. errProvider.SetError(tbx, "keine Zahl!")
    26. tbx.Select(0, tbx.Text.Length)
    27. End If
    28. If sender Is txtP Then P = Result
    29. If sender Is txtW Then W = Result
    30. If sender Is txtG Then G = Result
    31. End Sub
    32. Private Sub txtG_Validated(sender As Object, e As EventArgs) Handles txtG.Validated, txtW.Validated, txtP.Validated
    33. errProvider.Clear()
    34. End Sub
    35. End Class


    Zum Schluss muss noch gesagt werden, dass obige Konvertierungen ohne kulturabhängige Formatierungsinformatione abgewickelt werden...
    (dazu verlinkte TryParse-Überladung verwenden...)

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