TextBox Keydown-Event -> wenn Punkt gedrückt wurde, dann Punkt löschen und weiter springen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    TextBox Keydown-Event -> wenn Punkt gedrückt wurde, dann Punkt löschen und weiter springen

    Hallo zusammen,

    ich bin gerade dabei eine IP-Eingabe mit Textboxen zu verwirklichen.
    Nun möchte ich jedoch, dass wenn man die Taste "Punkt" (KeyCode müsste 109 sein!?) drückt, dass dieser dann NICHT in der Textbox auftaucht, sondern automatisch weiter springt in die nächste TextBox.

    Wie kann ich also den Punkt entfernen, dass dieser nicht in der TextBox auftaucht? Da sonst meine Fehlermeldung vom TextChanged-Event anschlägt.

    VB.NET-Quellcode

    1. ​Private Sub IP_Segment_TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles IP_Segment_TextBox1.KeyPress
    2. Select Case Asc(e.KeyChar)
    3. Case 48 To 57, 8, 46
    4. '48 bis 57 = Zahlen 0 bis 9
    5. '8 = Backspace/Rücktaste
    6. '32 = Space zulassen
    7. '52 = Entf/Delete Taste
    8. '44 = Komma
    9. '46 = Punkt
    10. '
    11. '
    12. Case Else
    13. e.Handled = True
    14. End Select
    15. If IP_Segment_TextBox1.Text.Length = 2 And e.KeyChar <> Chr(8) Then 'in nächste Box springen, wenn 3 Zeichen erreicht
    16. IP_Segment_TextBox2.Focus()
    17. IP_Segment_TextBox2.SelectAll()
    18. End If
    19. End Sub
    20. Private Sub IP_Segment_TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles IP_Segment_TextBox1.KeyDown
    21. If e.KeyCode = Keys.Left Then
    22. '... Wenn linke Pfeiltaste gedrückt wurde
    23. ElseIf e.KeyCode = Keys.Right Then
    24. '...Wenn rechte Pfeiltaste gedrückt wurde
    25. IP_Segment_TextBox2.Focus()
    26. IP_Segment_TextBox2.SelectAll()
    27. ElseIf e.KeyCode = 109 Then
    28. '...Wenn Punkt gedrückt wurde
    29. IP_Segment_TextBox2.Focus()
    30. IP_Segment_TextBox2.SelectAll()
    31. End If
    32. End Sub
    33. Private Sub IP_Segment_TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IP_Segment_TextBox1.TextChanged
    34. Dim tbValue As Byte
    35. If IP_Segment_TextBox1.Text = "" Then
    36. Else
    37. If Not (Byte.TryParse(IP_Segment_TextBox1.Text, tbValue)) OrElse tbValue < 1 OrElse tbValue > 255 Then
    38. 'IP_Segment_TextBox1.Text = "1"
    39. MsgBox(IP_Segment_TextBox1.Text & " ist kein gültiger Eintrag. Geben Sie einen Wert im Bereich von 1 und 223 ein.")
    40. If IP_Segment_TextBox1.Text = "0" Then
    41. IP_Segment_TextBox1.Text = "1"
    42. IP_Segment_TextBox1.Focus()
    43. IP_Segment_TextBox1.SelectAll()
    44. Else
    45. IP_Segment_TextBox1.Text = "223"
    46. IP_Segment_TextBox1.Focus()
    47. IP_Segment_TextBox1.SelectAll()
    48. End If
    49. End If
    50. End If
    51. End Sub
    1. Wenn Du einen Punkt erfasst, kannst Du im KeyDown-EventHandler e.Handled = True setzen und zur nächsten Box springen.
    2. Ne MaskedTextBox kommt nicht infrage? (siehe Anhang)
    3. Zeile#40: wieso 223?
    4. Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    5. Der Unterschied zwischen And und AndAlso/Or und OrElse
    Bilder
    • MaskedTextBox.png

      609 Byte, 161×27, 716 mal angesehen
    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.
    1. ok, so funktioniert es. danke.
    2. die MaskedTextBox habe ich schon einmal getestet, aber da hatte ich das Problem, dass die Punkte immer hin und her gerutscht sind. Deswegen bin ich davon abgekommen und wollte das nicht weiter testen. Vielleicht werde ich es aber irgendwann einmal nochmal probieren.
    3. Zeile #40 ist nicht 233 sondern 223. Die erste Ziffer einer IP darf nie größer sein. Ab der 2. Ziffer ist es so, dass diese bis 255 sein darf.
    4. mit Option Strict On arbeite ich schon immer bzw. seit vielen Jahren oder welche Einstellung soll ich genau prüfen?
    5. ja dieses Thema muss ich mir nochmal genauer ansehen :)
    • Zur MaskedTextBox: das ist eine Frage der Schriftart. Nimm MonoTypeSpace-Fonts, z.B. Lucida Console, da springt dann nix.
    • Zur 223/233? Die 233 hatte ich für ca. 1 Minute im Text, aber seit 23:32 nicht mehr … hm.
    • Bei dem Link geht's nicht nur um Option Strict On, sondern u.a. auch um den VB6-Namespace. Stichwort MsgBox
    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.
    @zauber777 Ich hab mir mal dafür ein UserControl gebaut, 4 TextBoxen, wo nur je maximal 3 Ziffern eingegeben werden können.
    Nach der dritten Ziffer oder bei Rechts geht es im nächsten Feld weiter.
    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!
    ich finds immer noch am einfachsten, eine IP einfach in eine Textbox einzugeben.
    Im Textbox_Validating-Event kann man beim Verlassen der TB prüfen, ob die Eingabe valide ist.
    Da kann man auch einen ErrorProvider setzen, der sehr hübsch den User über die Fehleingabe aufklärt.
    guggemol dieses: activevb.de/tipps/vbnettipps/tipp0083.html
    @ErfinderDesRades Es sollte aber verhindert werden, dass da "Roulade mit Klößen" drinne stehen kann. ;)
    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!

    RodFromGermany schrieb:

    @ErfinderDesRades Es sollte aber verhindert werden, dass da "Roulade mit Klößen" drinne stehen kann. ;)
    Ansichtssache.
    Beim Validating-Ansatz ist zulässig, jedweden Quatsch reinzuschreiben, auch "Roulade mit Klößen" - warum nicht?
    Im Validating-Event wird dann festgestellt, dass das keine IP ist, und der Wert wird nicht verarbeitet.
    Stattdessen macht ein ErrorProvider drauf aufmerksam, dass die Eingabe zu korrigieren ist.

    Hintergrund ist auch, dass eine IP-Eingabe - fast immer - während der Eingabe einen ungültigen Zwischenzustand einnimmt.
    Das verhindern zu wollen wäre einerseits sehr aufwändig, andererseits auch unergonomisch zu benutzen.