TextChanged-Ereignisse zweier TextBoxen, die sich gegenseitig auslösen

  • VB.NET

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

    TextChanged-Ereignisse zweier TextBoxen, die sich gegenseitig auslösen

    Als Beispiel ein Quarat mit S = Seite und D = Diagonale
    D = S * sqrt(2) und umgekert S = D/sqrt(2).
    Ein Eingabefeld als TextBox für Seite und eins für Diagonale.

    Mit TextChanged-Ereignis der Seite rechne ich die neue Diagonale und trage sie in TextBox für Diagonale ein. Und umgekehrt: Bei einem neuen Wert für Diagonale rechnet einen neuen Wert für Seite und trägt sie in TextBox für Seite ein.
    Damit wir aber TextChanged-Ereignis für Diagonale ausgelöst. Sie rechnet wiederum aus der neuen Diagonale einen neuen Wert für Seite und trägt sie in TextBox für Seite ein.
    Wenn der neue Wert für Seite nicht übereinstimmt mit dem Alten Wert (Rundungsfehler!), löst dies wiederum ein TextChanged-Ereignis für Seite und somit habe ich eine Schleife gebaut.
    Beim Testen mit Double-Werten konnte ich beobachten, dass TextChanged-Ereignis für Diagonale bis zu 3 Mal ausgelöst wurde.

    Der Effekt ist sicher bekannt, auch wenn ich ihn zum ersten Mal erlebe.
    Wie geht man denn damit um?

    Gruß
    @DMA Mach Dir in der Klasse ein Flag, das anzeigt, dass im TextChanged-Ereignis nix gemacht werden soll.
    Wenn Du fertig bist, löschst Du das Flag wieder.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    auch ists fragwürdig, bereits im TextChanged das eingegebene zu verarbeiten.
    Weil beim Eingeben kommt es immer zu temporär ungültigen Werten - und sei es auch nur, dass man die Textbox vor Eingabe leeren will.
    Normal verarbeitet man Eingaben nicht vor dem Validated-Event, was gefeuert wird, wenn der Focus das EingabeControl verlässt (und somit die Eingabe als abgeschlossen angesehen wird).

    Ist natürlich hübscher, wenn da während der Eingabe die anderen Controls iwie herumhopfen - aber dassis wie gesagt nicht immer konsistent, und je nachdem auch instabil.

    ErfinderDesRades schrieb:

    Validated-Event
    Grundsätzlich hast du nicht unrecht.

    Du kennst sicher den Fall das ein User nicht versteht, dass er nach seiner Eingabe Enter drücken (was vom Entwickler zusätzlich verarbeitet werden muss) muss bzw. „aus dem Control raus klicken“ muss. Daher ist das TextChaged Event aus meiner Sicht Benutzerfreundlicher.
    "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
    Ja, aber da muss man einigen Aufwand treiben, um das stabil und konsistent hinzukriegen.
    Besonders spannend wird es hier werden, dass dieselbe Textbox ja einmal Eingabe-Control ist, ein andermal aber Ausgabe.
    Und was soll bei ungültigen Zwischenzuständen angezeigt werden? Text löschen ist glaub keine gute Idee, aber ihn stehen lassen kann der User missverstehen als gültige Eingabe.

    Daher würde ich auf jeden Fall was mit Validating machen.
    Zusätzlich kann man weitere Eingabehilfen programmieren (zu denen ich das Anzeigen vorläufiger Ergebnisse zählen würde), aber das Validating sollte auf jeden Fall am Ende eine "Notbremse" ziehen.

    Übrigens die Ergebnis-Vorschau würde ich nicht in diversen TextChanges machen, sondern ich würde das einem Timer übertragen, und einfach alle 500ms neu ausrechnen.
    Das ist am einfachsten, um das Problem des Eingangsposts zu lösen, wo die TextChanged der Textboxen sich gegenseitig auslösten (Stichwort Ereigniskette).