Announcement

Collapse
No announcement yet.

Verständnisfrage zum TextBox_TextChanged Event

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verständnisfrage zum TextBox_TextChanged Event

    Hallo liebe Community,

    ich habe ein kleines Problem und verstehe den Hintergrund nicht, deswegen möchte ich euch um eure Hilfe bitten.

    Hintergrund:
    Ich schreibe ein Programm mit welchem eine Liste von Rechnernamen für eine SQL Query aufbereitet werden sollen, ebenfalls soll der umgekehrte Weg möglich sein.
    Das Programm enthält zwei TextBox Elemente, beim einfügen per Strg+V in eine TextBox soll die Umwandlung stattfinden.

    Aus:
    PC1
    PC2
    PC3

    Wird:
    'PC1','PC2','PC3'

    oder umgekehrt.

    Code:
    Im TextChanged Event der jeweiligen TextBox führe ich entsprechnden Code aus:

    TextBox1:
    Code:
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
            Dim sText As String = TextBox1.Text
            sText = sText.Replace(vbNewLine, "','")
            sText = "'" + sText
            sText = sText + "'"
            TextBox1.Text = sText
        End Sub
    TextBox2:
    Code:
    Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
            Dim sText As String = TextBox2.Text
            sText = sText.Replace("','", vbNewLine)
            sText = sText.Replace("'", "")
            TextBox2.Text = sText
        End Sub
    Der Code in TextBox2 funktioniert anstandslos und ich erhalte die Liste im Format:

    PC1
    PC2
    PC3

    Der Code in TextBox1 funktioniert nicht, das Programm regiert nicht mehr und wenn ich entsprechnd Debugge kann ich sehen das nach Ausführung des TextBox1_TextChanged Events selbiges sofort wieder aufgerufen wird...ich lande also in einer Endlosschleife.

    Für mich als ziemlichen Anfänger in VB.NET erschließt sich nicht wieso, da der Code doch eigentlich genau das selbe macht wie der im Event TextBox2_TextChanged.

    Auf welchem Holzweg bin ich da gelandet? Kann mir jemand Tips geben?

    Danke & Gruß
    Rolf

  • #2
    Eigentlich sollten beide EventHandler in einem Stack Overflow landen. Ein Ändern des Textes in TextChanged wird wieder ein TextChanged auslösen, außer dein bisheriger Text ist gleich dem neuen Text das wird abgefangen und kein Event ausgelöst(Der Text ändert sich dann ja auch nicht wirklich). Also wird wenn dein Code wenn er manchmal funktioniert in diesem Fall den Text nicht geändert haben sondern den gleichen Text wieder zuweisen.

    Du solltest wenn möglich im Eventhandler einer Property (wie zum Beispiel Text) nicht die Property selbst ändern das knallt mit hoher Garantie. Wenn das nicht anders geht dann merkt dir im TextChanged in einem Bool ob der Text von hier gesetzt wird. Dann kannst du in TextChanged wiederum prüfen ob TextChanged aus TextChanged ausgelöst wurde und den Event abbrechen (und natürlich den Marker zurücksetzen nicht vergessen).

    Comment


    • #3
      Du kannst auch via Code den EventHandler entfernen, bzw. definieren:

      [highlight=vb.net]
      Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
      Dim sText As String = TextBox1.Text
      RemoveHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
      sText = sText.Replace(vbNewLine, "','")
      sText = "'" + sText
      sText = sText + "'"
      TextBox1.Text = sText
      AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
      End Sub
      [/highlight]

      Gruss

      Comment


      • #4
        Hallo Ralf, vielen Dank für deine Antwort!
        Ich schau mir mal an wie ich das mit einem Boolean lösen kann.
        Von der Theorie her ist mir das klar, bei der technischen Lösung schaue ich mal wie ich weiter komme

        Comment


        • #5
          Hallo Wernfried, auch dir vielen Dank für deine Antwort!

          Auch diese Lösung werde ich einmal probieren, erscheint mir auf den ersten Blick etwas einfacher zu implementieren zu sein (...zumindestens für mich als Anfänger)

          Zu meinem Verständnis: Das heißt ich deaktiviere / entferne mit "RemoveHandler " das Ereignis so das das Steuerelement nicht mehr darauf reagiert und mit "AddHandler" aktiviere ich Ihn wieder bzw. füge Ihn hinzu?

          Comment


          • #6
            @Wernfried: Deine Lösung funktioniert einwandfrei mit nur 4 zusätzlichen Codezeilen

            Ich danke euch beiden für eure Zeit!

            Comment


            • #7
              Deine Lösung funktioniert einwandfrei mit nur 4 zusätzlichen Codezeilen
              Wenn man Errorhandling ignoriert Auch wenn ein Fehler unwahrscheinlich ist solltest du das ganze noch mit einem try...finally Block kapseln damit garantiert der Handler auch wieder angehängt wird wenn er einmal abgehängt war.

              Comment

              Working...
              X