Verhalten von Textboxen nach Return

  • VB.NET

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

    Verhalten von Textboxen nach Return

    Tach auch,

    bin etwas verwirrt (kann versprechen das werdet ihr noch öfters von mir lesen :D )
    Bin gerade dabei aus einer Access Anwendung eine VB.NET Anwendung zu machen.
    Habe schön ein umfangreiches Formular entsprechend eingerichtet und alle Textboxen den gleichen Namen gegeben wir zuvor in Access.
    Nun stelle ich auf einmal fest, wenn ich Text in einer Textbox ändere und dann Return drücke bleibt der Courser in der Textbox und springt nicht weiter.
    Auch sollte nach dem Ändern in der Textbox jeweils irgendwas passieren. Jedoch ein After Update wie in VBA gibt es nicht.
    Gesehen habe ich ein paar Beispiele und umgesetzt.

    VB.NET-Quellcode

    1. Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
    2. 'When we enter the TextBox, we save the text value
    3. TextBox2.Text = TextBox1.Text & " Textbox verlassen"
    4. End Sub
    5. Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    6. If e.KeyChar = Chr(13) Then
    7. SendKeys.Send("{TAB}")
    8. e.Handled = True 'Kein Bling Ton von Windows
    9. TextBox2.Text = TextBox1.Text & " Return gedrückt"
    10. End If
    11. End Sub


    Meine Frage nun:
    Ich muss dieses Verhalten, nach Return gehe zum nächsten Feld/Button (TabIndex) springen überall haben. Kann man das irgendwie hinbekommen?
    Muss das aus VBA bekannte Afterupdate wirklich mit einem Mehrzeiler abgefangen werden oder geht das einfacher? In Grunde genommen benötige ich das auch für jede Textbox.
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    Modifiziert nach stackoverflow:

    VB.NET-Quellcode

    1. Friend Class TextBoxWithOtherBehavior : Inherits TextBox
    2. Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
    3. If e.KeyChar <> Convert.ToChar(13) Then MyBase.OnKeyPress(e) : Return
    4. e.Handled = True
    5. Me.Parent.SelectNextControl(Me, True, True, True, True)
    6. End Sub
    7. End Class

    Rein damit ins Programm, kompilieren und dann aus der ToolBox ziehen und Deine TextBoxen durch das ersetzen. Dann hast Du das gewünschte Verhalten und musst den Code nicht zigmal einbauen.
    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.
    Tach,

    hört sich erst einmal gut an. Mal sehen ob ich es verstanden habe.
    Rein kopieren in den Application.Designer.vb und neu erstellen.
    Danach alle, aber auch alle Textboxen durch die TextBoxWithOtherBehavior austauschen?
    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL
    Nee, nicht in die Application.Designer.vb. In die ganz normale Form1.vb. Oder in ne eigene Datei.
    Ja, alle austauschen. Aber erst, sobald Du mit einer zusätzlichen SonderTextBox gesehen hast, dass es läuft.

    (hatte nicht neulich schonmal die schräge Idee, sowas in diese Datei zu schreiben?)
    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.
    ahja ...
    Habe es nun eine GlobaleClass.vb gepackt. da habe ich alles drinne was global gebraucht wird. So wie es von MS Access her kenne.

    Was ich dabei nicht bedacht habe, wenn der Inhalt im Textfeld nicht geändert wird, ich es aber verlasse (Return oder Tabulatur, Mauszeiger), dann darf keine Aktion ausgeführt werden.
    Ist der Inhalt geändert worden, soll eine Aktion stattfinden.

    Bekomme ich das über eine Leave irgendwie hin?

    In Access VBA gibt es so was wie [Me.Textbox.OldValue].
    Damit könnte ich es abfangen. Habe aber für VB.NET keine lösung gefunden.

    VB.NET-Quellcode

    1. Private Sub TextBoxWithOtherBehavior1_Leave(sender As Object, e As EventArgs) Handles TextBoxWithOtherBehavior1.Leave
    2. ' so wäre das in Access
    3. if Me.TextBoxWithOtherBehavior1.OldValue <> TextBoxWithOtherBehavior1.Text then
    4. Mach was
    5. End if
    6. End Sub

    Mit freundlichen Dinges

    Lupus
    P.S: bei allen meine Fragen beziehen sich auf das arbeiten mit Visual Studio 2019 auf Win 10/64 bit und MySQL

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

    Ja, das geht, allerdings musst Du dann bei der TextBoxWithOtherBehavior-Klasse nachbessern, weil es von Haus aus Access-mäßig keinen OldValue gibt:

    VB.NET-Quellcode

    1. Friend Class TextBoxWithOtherBehavior : Inherits TextBox
    2. Private _OldValue As String = Nothing
    3. Property OldValue As String
    4. Get
    5. Return _OldValue
    6. End Get
    7. Private Set
    8. _OldValue = Value
    9. End Set
    10. End Property
    11. Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
    12. If e.KeyChar <> Convert.ToChar(13) Then MyBase.OnKeyPress(e) : Return
    13. e.Handled = True
    14. Me.Parent.SelectNextControl(Me, True, True, True, True)
    15. End Sub
    16. Protected Overrides Sub OnGotFocus(e As EventArgs)
    17. OldValue = Me.Text
    18. MyBase.OnGotFocus(e)
    19. End Sub
    20. End Class

    Ich führe hiermit also eine öffentliche Property namens OldValue in die Klasse ein, die innerhalb der Klasse geändert, von außen aber nur eingesehen werden kann (Public Get, Private Set). Wenn die TextBox den Focus erhält, wird automatisch der OldValue überschrieben. Und wenn Du dann im Leave-EventHandler bist, kannst Du den OldValue auswerten. Soll allerdings für alle TextBoxen das Verhalten identisch sein, kann Dein Leave-Code natürlich auch in die TextBox-Klasse mit rein.
    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.