Fehler bei leerer Textbox

  • VB.NET
  • .NET 5–6

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Typhoon.

    Fehler bei leerer Textbox

    Hallo liebes Forum

    Folgender Fehler bringt mich zur verzweiflung.

    Mit diesem Code-Teil lasse ich einen Zahlenbereich farbig darstellen ob der Wert sehr gut - gut - oder schlecht ist.

    Visual Basic-Quellcode

    1. Private Sub txttnk1lwt_TextChanged(sender As Object, e As EventArgs) Handles txttnk1lwt.TextChanged
    2. Dim Sollwertschlechthoch As Integer = txttnk1lwtsoll.Text + 2 * 200
    3. Dim Sollwertschlechtniedrig As Integer = txttnk1lwtsoll.Text - 2 * 200
    4. Dim Sollwertguthoch As Integer = txttnk1lwtsoll.Text + 1 * 200
    5. Dim Sollwertgutniedrig As Integer = txttnk1lwtsoll.Text - 1 * 200
    6. If (txttnk1lwt.Text > Sollwertschlechthoch) Or (txttnk1lwt.Text < Sollwertschlechtniedrig) Then
    7. txttnk1lwt.BackColor = Color.Red
    8. ElseIf (txttnk1lwt.Text > Sollwertguthoch) Or (txttnk1lwt.Text < Sollwertgutniedrig) Then
    9. txttnk1lwt.BackColor = Color.Orange
    10. Else
    11. txttnk1lwt.BackColor = Color.LightGreen
    12. End If
    13. End Sub


    Funktioniert wunderbar.

    [/URL][/img]





    Problem ist, wenn ich die Textbox ganz leere weil ich mich z.b. verschrieben habe bekommen ich folgende Fehlermeldung:




    Kann mir bitte einer von euch sagen warum die Textbox nicht leer sein darf?

    Danke und Gruß

    Gebhard
    Schreib mal in die oberste Zeile vor allem anderen
    Option Strict On

    und behebe alle Fehler die dann angezeigt werde, das sollten einige sein, Problem gelöst. Wie soll aus einem leeren String eine Zahl werden? Klar das dir alles um die Ohren fliegt. Auch ist ein String keine Zahl, da sollte man parsen mit z.B Double.Parse oder besser Double.TryParse. Gibt es auch für Integer&Co.

    Weil beim start des Programms die Textboxen leer sind ist noch kein TextChanged eingetreten ist knallt es halt erst wenn du den Text entfernst.

    Lies das und mach das am besten, so verhinderst du solche Fehler, noch dazu lernst du Typ-Sicher zu programmieren.
    Visual Studio – Empfohlene Einstellungen
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Schreib mal „Immer Option Strict On“ in die Textbox und schau was passiert. Zudem solltest du dich mit Datentypen beschäftigen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Typhoon schrieb:

    Problem ist, wenn ich die Textbox ganz leere weil ich mich z.b. verschrieben habe (...)
    Kann mir bitte einer von euch sagen warum die Textbox nicht leer sein darf?

    Das kommt davon, wenn man TextBoxen, ComboBoxen, Labels etc. als Platzhalter für Variablen zum Weiterechnen missbraucht, denn die beiden Sachen, was man auf dem Bildschirm sieht und womit man rechnet/vergleicht, sollte man voneinander trennen. Ferner - alle möglichen Fehleingaben kann (und sollte) man mit IFs vorher abfangen, bevor sie in den Backofen reingehen, damit am Ende aus ihnen Brot mit der entsprechenden Krustenfarbe gebacken werden soll. Man kann den Spieß auch umdrehen und alles Unbrauchbare mit Try-Catch abfangen, den brauchbaren Rest dann für die Weiterverwendung nehmen. Und so nebenbei - String ist kein Integer und vice versa, der Compiler wandelt heimlich alles für einen um, weil man vermutlich alle möglichen Sicherungen bewusst oder unbewusst überbrückt hat - irgendwann mal stolpert er dann dabei, weil eben Birnen nicht Äpfel sind.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gregor Jasinski“ ()

    @DTF, @mrMo

    mit Option Strict On kommen gleich mal 30 Fehler!!! Wow Da kommt viel Arbeit auf mich zu.

    @Gregor Jasinski

    Das kommt davon, wenn man TextBoxen, ComboBoxen, Labels etc. als Platzhalter für Variablen zum Weiterechnen missbraucht


    Verstehe ich nicht. Ich möchte demjenigen der den Wert eingibt ein Feedback geben. In dem Fall Farblich hervorheben ob der Messwert in einem akzeptablen Bereicht liegt. Ist das keine gute Lösung?

    Ich war wieder einmal zu voreilig.

    Habs mit folgendem zusatz Code so gelöst:

    Visual Basic-Quellcode

    1. Private Sub txttnk1lwt_TextChanged(sender As Object, e As EventArgs) Handles txttnk1lwt.TextChanged
    2. Dim Sollwertschlechthoch As Integer = CInt(txttnk1lwtsoll.Text) + 2 * 200
    3. Dim Sollwertschlechtniedrig As Integer = CInt(txttnk1lwtsoll.Text) - 2 * 200
    4. Dim Sollwertguthoch As Integer = CInt(txttnk1lwtsoll.Text) + 1 * 200
    5. Dim Sollwertgutniedrig As Integer = CInt(txttnk1lwtsoll.Text) - 1 * 200
    6. If txttnk1lwt.Text = "" Then
    7. txttnk1lwt.BackColor = Color.White
    8. ElseIf (CInt(txttnk1lwt.Text) > Sollwertschlechthoch) Or CInt(txttnk1lwtsoll.Text) < Sollwertschlechtniedrig Then
    9. txttnk1lwt.BackColor = Color.Red
    10. ElseIf (CInt(txttnk1lwtsoll.Text) > Sollwertguthoch) Or CInt(txttnk1lwtsoll.Text) < Sollwertgutniedrig Then
    11. txttnk1lwt.BackColor = Color.Orange
    12. Else
    13. txttnk1lwt.BackColor = Color.LightGreen
    14. End If
    15. End Sub


    So kann die Textbox leer bleiben ohne Fehlermeldung.

    Danke für eure Tipps

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

    Typhoon schrieb:

    mit Option Strict On kommen gleich mal 30 Fehler!!
    Die waren da schon vorher, nur hast du sie nicht gesehen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ersten das und hast du mal gemacht was @mrMo dir gesagt hat? Ist dir auch alles um die Ohren geflogen? Oder hast du die eingaben begrenzt? Das muss man nicht mal, ist aber einfacher für den user.


    Der richtige Weg ist das in variablen zu packen und keine UI-Element als Datenspeicher nutzen. Diese sind nur für interaktion/ansicht gedacht. Führe diesen Code mal aus!

    VB.NET-Quellcode

    1. Dim s As String = "123" 'bzw textBox.Text
    2. Dim i As Integer
    3. If Integer.TryParse(s, i) Then
    4. MessageBox.Show("Der Wert ist nun in Variable i")
    5. Else
    6. MessageBox.Show("Konnte nicht parsen")
    7. End If
    8. s = "Eins"
    9. If Integer.TryParse(s, i) Then
    10. MessageBox.Show("Der Wert ist nun in Variable i")
    11. Else
    12. MessageBox.Show("Konnte nicht parsen")
    13. End If

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Typhoon schrieb:


    Verstehe ich nicht (...)

    Ich kann leider nicht bei Adam und Eva anfangen und an sich erklärt - sogar sehr anschaulich mit Brot, Backofen, Birnen, Äpfeln etc. - habe ich es schon.


    If txttnk1lwt.Text = "" Then -> So kann die Textbox leer bleiben ohne Fehlermeldung.

    Das wird noch eine lange Odyssee werden, wenn man die Umwandlungen nicht selbst und dann auch entsprechend kontrolliert in die Hand nehmen möchte, denn es gibt ja nicht nur TextBoxen und leere Strings - viel Erfolg.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gregor Jasinski“ ()

    @DTF, @Gregor Jasinski

    Danke nochmals für eure Unterstützung.

    @DTF

    Der richtige Weg ist das in variablen zu packen und keine UI-Element als Datenspeicher nutzen. Diese sind nur für interaktion/ansicht gedacht. Führe diesen Code mal aus!


    Hab ich gemacht, ich kann damit aber nichts anfangen. Sorry das verstehe ich nicht.

    Danke und einen Schönen Abend noch!!
    Lerne was damit anzufangen, sonst wirst du immer wieder solche Überraschungen erleben.

    Die Funktion liest/parst den String und wenn das eine gültige Zahl ist gibt die Funktion True zurück und der Wert ist dann in der Integer-Variable. Schlägt es fehl, weil nicht geparset werden kann, also keine Gültige Zahl im Text gefunden werden konnte, landet man beim else, weil False zurück kommt.

    Ich hätte besser schreiben sollen:

    VB.NET-Quellcode

    1. If Integer.TryParse(s, i) = True Then
    2. MessageBox.Show("Der Wert ist nun in Variable i")
    3. Else
    4. MessageBox.Show("Konnte nicht parsen")
    5. End If


    Ist das gleiche, aber anfänger verstehen das oft ohne das = True nicht.

    If Bedingung Then
    ist das gleiche wie
    If Bedingung = True Then
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Einfach statt Textboxen nen NumericUpDown verwenden, dann muss man nichts parsen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Typhoon schrieb:

    (...) Hab ich gemacht, ich kann damit aber nichts anfangen. Sorry das verstehe ich nicht.

    OK, etwas schreibe ich noch dazu. Was ich mit der strikten Trennung von Variablen zum Rechnen/Vergleichen einerseits und zum Anzeigen auf dem Schirm andererseits ganz am Anfang meiner Ausführungen meinte, ist, dass man so eine Stringvariable, die sich quasi direkt in einer TextBox befindet, mit einer Schultafel vergleichen kann - jeder darf alles auf dieser Tafel schreiben und kritzeln, diese Variable mit diesem Gekritzel wird vom Betriebssystem normalerweise einfach nur dafür verwendet, um den Inhalt auf dem Bildschirm anzuzeigen und dementsprechend passiert auch nichts schlimmes (im Sinne von Fehlermeldung). Wenn man den Inhalt der Tafel aber, so wie er ist und vor allem ohne zu wissen, wie er ist, einfach so nimmt und mit ihm rechnen oder irgendetwas vergleichen möchte, wird es früher oder später zu einem Umwandlungsfehler bzw. Typkonflikt kommen, denn der Compiler hat diese Umwandlungsroutine(n) beim Abholen des Inhalts aus der Tafel (und in die entgegengesetzte Richtung natürlich auch) dazwischengeschaltet (in den Code für den faulen User unsichtbar eingebaut), weil man ja nicht die Verantwortung übernehmen wollte oder möchte, diese Typenwandlung selbst in die Hand zu nehmen und durchzuführen ('Option Strict' wird dauerhaft auf Off statt auf On gelassen). Damit beginnt dann die lange Irrfahrt des Odysseus, die viele unnötig machen, manche kehren nicht mehr zurück. Man hätte den Inhalt der Textbox auslesen, ihn dann unter kontrollierten Bedingungen mit Try-Catch-Block versuchen, in eine Ganzzahl (Integer) umzuwandeln - wird ein Fehler bei der Umwandlung abgefangen, kann man z.B. weiter mit 0 rechnen; ist bei der Umwandlung dagegen nichts schiefgelaufen, hat man erstmal eine Ganzzahl in der Hand; jetzt müsste man überprüfen, ob diese z.B. total für das, was wir uns so in unserer Anwendung ausgedacht haben, absurd oder unbrauchbar ist - negative oder viel zu große Zahlen wären z.B. solche Kandidaten -> dann sollte man diese verwerfen und z.B. auch mit 0 weitermachen. Ist nach diesem Prozedere aber eine brauchbare Zahl innerhalb unseres Zahlenbereichs als Wandlungsergebnis entstanden, dann - und nur dann - darf man damit ohne Eingriffe weiterrechnen. Das Ergebnis speichert man sich am besten in einer separaten Variable, die man vorher schon dafür extra vorbereitet und deklariert hat, selbstverständlich auch gleich passend als z.B. Integer, und kann auf diese dann weiter im Programmlauf sicher zugreifen - eine Trennung oder Abkopplung von der TextBox, von der gesprochen wurde, ist damit sehr einfach erledigt, alle Fehlerquellen im Kontext dieser Ereigniskette ausgeschlossen. Diese Variable ist dann quasi in einer Schublade auf einem Papierblatt mit einem Schlüssel verschlossen und nicht auf der Tafel, wo jeder weiterkritzeln darf und sich jederzeit etwas wieder verändern kann.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gregor Jasinski“ ()

    Du könntest auch generell erstmal dafür sorgen, dass nur Zahlen in der Textbox eingegeben werden können

    VB.NET-Quellcode

    1. Private Sub TxtBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtBox.KeyPress
    2. Select Case Asc(e.KeyChar)
    3. Case 48 To 57, 8
    4. ' Zahlen, Backspace und Space zulassen
    5. Case Else
    6. ' alle anderen Eingaben unterdrücken
    7. e.Handled = True
    8. End Select
    9. End Sub
    Dann muss aber noch das Komma behandelt/erlaubt werden, dann müsste man dafür sorgen, dass nur ein Komma vorkommen kann, dann kann man statt ner TextBox auch gleich ein NumericUpDown verwenden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Falls man Kommazahlen für das Projekt braucht, kann man alles, was ich beschrieben habe, relativ schnell auch auf Single oder Double umstellen – man könnte sogar auch eine Zahl im hexadezimalen Format entgegennehmen, ist z.B. beim Bytelesen manchmal notwendig oder praktisch, mit einer zusätzlichen Konvertierung könnte man sich das Ergebnis in Großbuchstaben zur Verfügung stellen. Normalerweise beschränke ich auch die Anzahl der Zeichen, die in so einem Eingabebereich einer TextBox eingegeben werden können, damit so ein Eingabefeld auf dem Bildschirm dann als idiotensicher gelten darf – 5 bis 10 Stellen/Zeichen würden hier vermutlich völlig ausreichend als Begrenzung fungieren. Aufgerundete Integer für Berechnungen als Ist-Werte zu nehmen, wenn die Soll-Werte schon ein Komma implizieren, wäre – euphemistisch gesprochen – etwas am Ziel vorbeigeschossen oder inkonsistent, wenn man es nicht explizit so haben möchte, andererseits braucht man in einem Zimmer oder draußen vor dem Fenster die Temperatur nicht mit zwei Nachkommastellen abzulesen, auch bei einer Nachkommastelle ist der Fehler vermutlich so groß, dass es keinen Sinn mehr macht, so eine hohe Genauigkeit einzuführen oder zu verwenden - wenn man aber mit speziellen Methoden/Messgeräten z.B. Temperaturen in Flüssigkeiten messen will und kann, würde es wieder Sinn machen. Mann könnte auch echte oder aufgerundete Integer interpolieren, um so mit Hilfe von zeitdiskreten Daten künstlich an Kommazahlen zu kommen, das ist aber ein ganz anderes Thema und das Betreiben eines völlig unnötigen Aufwands, wenn Fließkommazahlen vom Hause aus großzügig zur Verfügung stehen - bei einer Schaltung mit einer relativ kleinen Mikrocontrollerbusbreite könnte man solche Kunstgriffe vielleicht in Erwägung ziehen.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    Hallo zusammen

    Danke nochmals für euer Feedback.

    Also diese Option " Option Strict On " sollte so wie ich das verstanden habe eine gute Sache sein.
    Das Programm an dem ich gerade arbeite funktioniert jetzt ganz ohne Fehler. ( Option Strict OFF )
    Option Strict ON und patsch 216 Fehler werden angezeigt und nichts geht mehr. ???

    Ein Beispiel aus meinem Programm:
    Eine SELECT Abfrage sicht wie folgt aus:

    Visual Basic-Quellcode

    1. Module dbSelectMessungJahr
    2. 'Abfrage: Messung Jahr
    3. Public Function MySqlSelectMessungJahr(selectedJahr)
    4. 'variable definieren und predefined statement einfügen
    5. Dim select_statement As String = "SELECT
    6. `DWP`.`feuchtmittelmessung`.`tank`,
    7. DATE_FORMAT(`DWP`.`feuchtmittelmessung`.`datum`, '%d.%m.%Y') AS datum,
    8. `DWP`.`feuchtmittelmessung`.`leitwert`,
    9. `DWP`.`feuchtmittelmessung`.`phwert`,
    10. `DWP`.`feuchtmittelmessung`.`temperatur`,
    11. `DWP`.`feuchtmittelmessung`.`user`,
    12. `DWP`.`feuchtmittelmessung`.`feuchtmittelzusatz`,
    13. `DWP`.`feuchtmittelmessung`.`anmerkung`,
    14. `DWP`.`feuchtmittelmessung`.`filter1`,
    15. `DWP`.`feuchtmittelmessung`.`filter2`
    16. FROM `DWP`.`feuchtmittelmessung` WHERE DATE_FORMAT(`DWP`.`feuchtmittelmessung`.`datum`, '%Y') = '" & selectedJahr & "'
    17. ORDER BY `DWP`.`feuchtmittelmessung`.`datum`;"
    18. 'Statement zurückgeben
    19. Return select_statement
    20. End Function
    21. End Module


    Funktioniert. Wird Option Strict ON aktiviert wird in diesem Code-Teil folgender Fehler angezeigt:

    BC30210"Option Strict ON" erfordert, dass alle Funktions-,Eigenschafts- und Operatordeklarationen eine As-Klausel enthalten

    Dabei wird

    VB.NET-Quellcode

    1. MySqlSelectMessungJahr(selectedJahr)
    und

    VB.NET-Quellcode

    1. & selectedJahr &
    mit einer Roten Wellenlinie untermalt

    Da verstehe ich nur Bahnhof??? Was ist da falsch
    Zeile 21 in deiner Function. Was ist denn "select_statement" für ein Datentyp? Genau der muss dann auch angegeben werden: Public Function MySqlSelectMessungJahr(selectedJahr) As DEINDATENTYP
    Bei Option Strict Off würfelt sich der Compiler das zusammen. Wenn z.B. Datentypen aber nicht zusammen passen, dann knallt's zur Laufzeit.
    Bei Option Strict On fällt das während dem Coden schon auf. Dann viel Vergnügen, die 216 Fehler zu beheben (und die vermutlich daraus entstehenden Folgefehler) ;)

    Davon mal abgesehen, würde ich mir für dein Beispiel gar keine Funktion bauen, sondern das Jahr als Variable deklarieren.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl

    Dann viel Vergnügen, die 216 Fehler zu beheben (und die vermutlich daraus entstehenden Folgefehler)


    Danke für die Aufmunterung ;)
    Spaß bei Seite, ob ich mir das jetzt noch antue alle Option Strict ON Fehler zu beheben.... keine Ahnung

    Davon mal abgesehen, würde ich mir für dein Beispiel gar keine Funktion bauen, sondern das Jahr als Variable deklarieren.


    Wie kann ich das Verstehen? Ich wähle ja das Jahr aus der Combobox aus das mir dann alle Messwerte aus dem Ausgewählten Jahr in einer DataGridView anzeigt.

    Typhoon schrieb:

    Option Strict ON Fehler zu beheben.... keine Ahnung


    Ich empfehle dir das unbedingt :!:
    Genau so wie die Einstellung dazu im Studio zu ändern, damit neue Projekte schon automatisch so eingestellt sind.

    Dauert ein wenig bis du dich dran gewöhnst, aber nicht ewig. Ich dachte damals auch warum soll ich mir das antun? Geht doch so! Heute, viele viele Jahre später denke ich warum hast du dir überhaupt Option Strict Off angetan. Ich hatte immer wieder Fehler, bis ich die "Schnauze voll davon hatte" und mich gezwungen habe Option Strict On zuschalten.

    Machst du es nicht ist dein Programm vergleichbar mit dem hier:(Lustiges Gif dort zu sehen, zumindest finde ich es amüsant)
    twitter.com/FrRonconi/status/1626963919179853824
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Typhoon schrieb:

    (...) Option Strict ON und patsch 216 Fehler werden angezeigt und nichts geht mehr. ???

    Nun ja, wie ich schon vermutet habe, das wird eine lange Reise mit vielen Sirenen unterwegs sein – eine idiotensichere Texteingabe in einer TextBox zu gestalten ist momentan wohl das kleinste Problem und im Grunde genommen Nebensache oder völlig wertlos.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.