Keys.Enter und textbox.leave abfragen

  • VB.NET

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

    Keys.Enter und textbox.leave abfragen

    Hallo,
    kann mir einer nen Tip geben, wie ich in dem folgenden Code herausfinden kann, ob das leave event ausgelöst wurde.


    VB.NET-Quellcode

    1. Private Sub txtProfilname_TextChanged(sender As Object, e As EventArgs) Handles txtProfilname.KeyUp, txtProfilname.Leave
    2. Dim _Key As KeyEventArgs = DirectCast(e, KeyEventArgs)
    3. If _Key.KeyCode = Keys.Enter Then
    4. If txtProfilname.Text = String.Empty Then
    5. MessageBox.Show("Bitte Profilnamen angeben.")
    6. txtProfilname.Focus()
    7. Else
    8. _Profilname = txtProfilname.Text
    9. End If
    10. End If
    11. End Sub


    kiter20
    "Mann" lernt mit seinen Projekten.
    Ich möchte innerhalb dieser Sub unterscheiden, ob die Taste Enter gedrückt wurde oder die Textbox ihren Focus verloren hat.

    Danach überprüfe ich ob die Textbox leer ist.

    VB.NET-Quellcode

    1. If _Key.KeyCode = Keys.Enter or "TextBox den Focus verloren" Then

    "Mann" lernt mit seinen Projekten.

    mox schrieb:

    wieso im textchange event

    Hatte nur den Text nicht angepasst.

    Hier der Code wenn ich das einzelnd abfrage. So soll das funktionieren.
    Um nun Code zu Sparen und das etwas übersichtlicher zu bekommen. Wollte ich das in eine Anweisung schreiben.
    Dafür muss ich dann aber unterscheiden, ob ein .leave event oder .keyup event ausgelöst wurde.

    VB.NET-Quellcode

    1. Private Sub txtProfilname_Leave(sender As Object, e As EventArgs) Handles txtProfilname.Leave
    2. If txtProfilname.Text = String.Empty Then
    3. MessageBox.Show("Bitte Profilnamen angeben.")
    4. txtProfilname.Focus()
    5. Else
    6. _Profilname = txtProfilname.Text
    7. End If
    8. End Sub
    9. Private Sub txtProfilname_KeyEnter(sender As Object, e As KeyEventArgs) Handles txtProfilname.KeyUp
    10. If e.KeyCode = Keys.Enter Then
    11. If txtProfilname.Text = String.Empty Then
    12. MessageBox.Show("Bitte Profilnamen angeben.")
    13. txtProfilname.Focus()
    14. Else
    15. _Profilname = txtProfilname.Text
    16. End If
    17. End If
    18. End Sub
    "Mann" lernt mit seinen Projekten.

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

    @ErfinderDesRades Das ist wieder son VB-Mist, weil da die Argument-Typen nicht abgecheckt werden :S
    @kiter20 In VB.NET ganz einfach:

    VB.NET-Quellcode

    1. Private Sub txtProfilname_TextChanged(sender As Object, e As EventArgs) Handles txtProfilname.KeyUp, txtProfilname.Leave
    2. If Not (TypeOf e Is KeyEventArgs) Then
    3. MessageBox.Show("Leave")
    4. Return
    5. End If
    6. Dim _Key As KeyEventArgs = DirectCast(e, KeyEventArgs)
    7. If _Key.KeyCode = Keys.Enter Then
    8. If txtProfilname.Text = String.Empty Then
    9. MessageBox.Show("Bitte Profilnamen angeben.")
    10. txtProfilname.Focus()
    11. Else
    12. _Profilname = txtProfilname.Text
    13. End If
    14. End If
    15. End Sub

    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!
    nein, das ist kein Mist, sondern ist Polymorphie.
    TryCast wäre übrigens vorzuziehen

    VB.NET-Quellcode

    1. Private Sub txtProfilname_TextChanged(sender As Object, e As EventArgs) Handles txtProfilname.KeyUp, txtProfilname.Leave
    2. Dim _Key As KeyEventArgs = TryCast(e, KeyEventArgs)
    3. If _Key Is Nothing Then
    4. MessageBox.Show("Leave")
    5. Return
    6. End If
    7. If _Key.KeyCode = Keys.Enter Then
    8. If txtProfilname.Text = String.Empty Then
    9. MessageBox.Show("Bitte Profilnamen angeben.")
    10. txtProfilname.Focus()
    11. Else
    12. _Profilname = txtProfilname.Text
    13. End If
    14. End If
    15. End Sub
    Also ich sag jetzt nicht, dass solch Code besonders sinnvoll sei, und ich erzähl dir jetzt sicher nix neues: das Prinzip ist in OOP unverzichtbar.

    ErfinderDesRades schrieb:

    nein, das ist kein Mist, sondern ist Polymorphie.
    Dann wäre C# nicht OO- und Polymorphie-geeignet: 8|

    C#-Quellcode

    1. this.textBox1.Leave += new System.EventHandler(this.textBox1_TextChanged);
    2. this.textBox1.KeyUp += new System.EventHandler(this.textBox1_TextChanged);
    Bilder
    • KeyUp.jpg

      22,05 kB, 867×125, 123 mal angesehen
    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!

    C#-Quellcode

    1. public Form1() {
    2. InitializeComponent();
    3. //machs halt richtig:
    4. textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    5. this.textBox1.Leave += new EventHandler(this.textBox1_TextChanged);
    6. this.textBox1.KeyUp += new System.Windows.Forms.KeyEventHandler(this.textBox1_TextChanged);
    7. //oder machs dir gleich einfach:
    8. textBox1.TextChanged += textBox1_TextChanged;
    9. this.textBox1.Leave += textBox1_TextChanged;
    10. this.textBox1.KeyUp += textBox1_TextChanged;
    11. }
    12. public void textBox1_TextChanged(object sender, EventArgs e) { }
    Genau genommen ists übrigens ein Polymorphie-Spezialfall, nämlich die implizite Umwandlung von Delegaten mit allgemeineren Argumenten in Delegaten mit engeren Argumenten.
    Stichwort "CoVarianz und ContraVarianz"

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

    @ErfinderDesRades
    @mox

    Sinnvoll oder nicht. Egal.
    Meine Denkweise war, alles was damit zu tun hat, die textbox ohne Text zu verlassen in einer Anweisung abzufangen.

    Dies sehe Ich als Sinnvoll an.

    Hier der Code, wie ich ihn jetzt verwende:

    VB.NET-Quellcode

    1. Private Sub txtProfilname_Leave(sender As Object, e As EventArgs) Handles cmbProfilName.Leave, cmbProfilName.KeyUp
    2. Dim Taste = TryCast(e, KeyEventArgs)
    3. If Not (TypeOf e Is KeyEventArgs) Then
    4. If cmbProfilName.Text = String.Empty Then
    5. MessageBox.Show("Bitte Profilnamen angeben.")
    6. cmbProfilName.Focus()
    7. Else
    8. _Profilname = cmbProfilName.Text
    9. End If
    10. Return
    11. Else
    12. If Taste.KeyCode = Keys.Enter Then
    13. If cmbProfilName.Text = String.Empty Then
    14. MessageBox.Show("Bitte Profilnamen angeben.")
    15. cmbProfilName.Focus()
    16. Else
    17. _Profilname = cmbProfilName.Text
    18. End If
    19. End If
    20. End If
    21. End Sub


    Danke für die Tipps ;)
    "Mann" lernt mit seinen Projekten.

    ErfinderDesRades schrieb:

    den Sinn vom TryCast haste scheints nicht gecheckt,was?


    Dahingehend habe ich auch nicht nachgedacht, dass in dem Moment dort Nothing rauskomt.

    Ich habe die Typüberprüfung als die Lösung gesehen, da Ich darüber rausbekomme, welches event ausgelöst hat.
    Somit könnte Ich auch verschiedenste events abfangen.

    Das TryCast hatte ich in der Kategerie Fehler vorbeugen eingestuft.
    Na klar, wenn Taste = Nothing, dann kann nur das andere event ausgelöst haben. Was aber für die Zukunft, wenn Ich 3 verschieden events abfangen möchte?

    Somit wäre ja die Antwort auf die Frage Post #1 ganz klar: "TypeOf"
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    wenn Ich 3 verschieden events abfangen möchte?
    Fang an mit Haltepunkt drauf und Shift+F9.
    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!
    Warum musst du überhaupt mehrere Events in einem Handles abbilden?
    Warum nicht einfach:

    VB.NET-Quellcode

    1. Private Sub ... Handles cmbProfilName.Leave
    2. 'Hier rein was bei leave passiert
    3. End Sub
    4. Private Sub ... Handles cmbProfilName.KeyUp
    5. 'Hier rein was bei KeyUp passiert
    6. End Sub
    7. Private Sub ... Handles cmbProfilName.KeyDown
    8. 'Hier rein was bei KeyDown passiert
    9. End Sub


    Du machst doch scheinbar bei jedem Typ was anderes. Wenn es jetzt immer das gleiche wäre würde ich die Aktion ja noch verstehen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    RodFromGermany schrieb:

    Fang an mit Haltepunkt drauf und Shift+F9.


    Nein, so war der post nicht gemeint.
    Ich gehe momentan davon aus daß dass mit TypeOf funktionieren wird.
    Ich wollte damit nur eine Begründung dafür geben in dieser Situation nicht das ergebnis des TryCast abzufragen.

    Denn es könnt ja auch sein daß ich kein Cast vorher habe.
    Sonder einfach nur wissen möchte, welcher event es war.

    Und das geht doch mit TypeOf , oder nicht?

    Am Anfang wurde gesagt, dass man nicht rausbekommt welches event ausgelöst hat, Das ist somit wiederlegt, es geht sogar sehr einfach.

    _______________________________

    Schamash schrieb:

    Warum musst du überhaupt mehrere Events in einem Handles abbilden?

    Post #15
    Naja, Ich möchte es halt.
    "Mann" lernt mit seinen Projekten.