Textboxen bestimmte Zeichen erlauben

  • VB.NET

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

    Textboxen bestimmte Zeichen erlauben

    Guten Morgen,
    ich habe mal wieder eine Frage.

    Ich habe eine Textbox in der ich nur Zahlen zulasse, hier der Code:

    VB.NET-Quellcode

    1. Dim abfragen = txtAngabe.Text If Not IsNumeric(abfragen) = True Then MsgBox("Bitte gebe nur Zahlen ein") End If



    Doch jetzt möchte ich auch noch gerne, das in der Textbox dieses Zeicchen ":" erlaubt wird.
    Könnt ihr mir bitte dabei helfen?

    MfG Manny


    Edit by Dodo:
    -> Topic zusammengefasst

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

    Messagebox für sowas ist eher schlecht und nervt den Benutzer. Besser ist es, die Tasten abzufangen und nur die zuzulasen, die du haben möchtest. dazu bietet sich das KeyDown-Event an. Hier testest du, ob die Taste (e.Keycode) erlaubt ist. Wenn nicht, dann wird mit e.cancel die Eingabe ignoriert.
    Es kömmt jetzt aber auch darauf an, was du für ein Format eingeben möchtest. Mit ":" sieht sehr nach Time oder Timespan aus. Hier benutze lieber Tryparse zum Testen des eingegebenen Formates.
    Noch eine Möglichkeit bietet die Nutzung der dafür vorgesehenen Controls: NumericUpDown für Zahlen, MaskedTextbox, DateTimePicker

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Lass Dir das KeyDown-Event der TextBox generieren, da kannst Du für jede Taste festlegen, ob sie gedrückt werden darf:

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    2. Select Case e.KeyCode
    3. Case Keys.D0 To Keys.D9
    4. ' diese Tasten sind erlaubt
    5. Case Else
    6. e.SuppressKeyPress = True ' diese Tasten werden ignoriert
    7. End Select
    8. End Sub
    Füge einfach die Codes weiterer Tasten hinzu (z.B. Del, BackSpace)
    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!
    Danke für die Antworten. Werde sie später mal Testen.

    edit:
    Wie nennt sich denn die Doppelpunkt Taste in Visual Basic 2010?


    Edit by Dodo:
    Keine Doppelpostings => Boardregeln
    -> Beiträge zusammengefügt

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

    Geheimtipp:

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    2. Label1.Text = e.KeyCode.ToString
    3. End Sub
    ==> Keys.OemPeriod
    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!
    Geht leider auch nicht

    Hier mal der Code

    VB.NET-Quellcode

    1. Private Sub txtAngabe_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtAngabe.KeyDown Select Case e.KeyCode Case Keys.D0 To Keys.D9 Case Keys.NumPad0 To Keys.NumPad9 Case Keys.Back Case Keys.ShiftKey
    2. Case Else e.SuppressKeyPress = True
    3. End Select End Sub

    Manny89 schrieb:

    Geht leider auch nicht
    Was geht auch nicht?
    Hast Du Keys.OemPeriod in Deiner Aufzählung vergessen?
    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!
    Hi
    kleine Anmerkung: Einfügen funktioniert trotzdem, da kein KeyDown-Ereignis für alle Buchstaben gefeuert wird. D.h. es wäre ganz gut, im Nachhinein noch mal nach Buchstaben zu suchen und, falls welche gefunden wurden, diese zu entfernen oder die Message abzufangen. Es wäre eh ganz praktisch, eine eigene Klasse für die TextBox anzulegen:

    VB.NET-Quellcode

    1. Public Class FilterTextBox
    2. Inherits TextBox
    3. Private Const WM_PASTE As Integer = &H302
    4. Protected Overrides Sub WndProc(ByRef m As Message)
    5. If m.Msg = WM_PASTE Then
    6. SelectedText = Filter(Clipboard.GetText())
    7. Else
    8. MyBase.WndProc(m)
    9. End If
    10. End Sub
    11. Private Function Filter(ByVal text As String) As String
    12. Dim outp As New System.Text.StringBuilder(text.Length)
    13. For Each c As Char In text
    14. If IsInputChar(c) Then outp.Append(c)
    15. Next
    16. Return outp.ToString()
    17. End Function
    18. Protected Overrides Function IsInputChar(ByVal charCode As Char) As Boolean
    19. Return "A"c <= charCode AndAlso charCode < "Z"c OrElse _
    20. "a"c <= charCode AndAlso charCode <= "z"c OrElse _
    21. "0"c <= charCode AndAlso charCode <= "9"
    22. End Function
    23. Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs )
    24. e.Handled = Not(char.IsControl(e.KeyChar) OrElse IsInputChar(e.KeyChar))
    25. MyBase.OnKeyPress(e)
    26. End Sub
    27. End Class


    Gruß
    ~blaze~
    Da sollte es genügen, das TextChange-Event auszuformulieren, denn C&P-P geht auch da drüber.
    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!
    Das mit denn DateTime-Picker bin ich gerade am testen, doch wie kann ich den DateTime-Picker so einstellen, dass man nur eine Uhrzeit sich aussuchen kann und kein Datum.

    VB.NET-Quellcode

    1. ticker.Format = DateTimePickerFormat.Custom ticker.CustomFormat = "HH:mm"



    So geht es leider nicht

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

    VB.NET-Quellcode

    1. Private Sub textbox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles textbox1.KeyPress
    2. Select Case Asc(e.KeyChar)
    3. Case 48 To 57, 8, 44
    4. Case Else
    5. e.Handled = True
    6. End Select
    7. End Sub


    Das erlaubt zahlen und das komma. kannst ":" einfach noch hinzufügen. funktioniert optimal und ist wenig code

    Loquax schrieb:

    funktioniert optimal und ist wenig code

    Toll. Und die Eingabe von 99:5::26 ist auch möglich. Wie soll das in eine Uhrzeit umgewandelt werden können? Du mußt bei sowas immer mit nem DAU rechnen und alle Fehleingaben möglichst so abfangen, dasses nich nervt durch Messageboxen und gelöschte Eingaben und ....

    DateTimePicker nur für Uhrzeit weisichnich...
    Die MaskedTextbox ist dazu besser geeignet. Im Designer dann nach Property Mask suchen und Uhrzeit auswählen.

    Fiel Fergnügen

    Vatter

    Edit: @Manny89 die zahlen stellen den KeyCode als ASCII dar. Ist schlecht lesbar und für deinen Einsatzfall absoluter Crap (siehe oben)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: