Wie IsNumeric in VB.Net

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    VaporiZed schrieb:

    Es geht eher um die inhaltlichen Aspekte der App, also das eigentliche Problem, was es zu lösen oder zu verwalten gibt …


    Grundsätzlich wäre es so etwas Ähnliches wie eine Kniffel/Yahtzee Block.
    Ich denke, ich werde wohl dabei bleiben, dass man eingeben kann, was man will und nach dem Button klick, auf Fehler hingewiesen wird.
    ein Standard-Verfahren für sowas heisst auch "Validierung". Dabei wird beim Verlassen einer Textbox ihr Inhalt geprüft, und ggfs. abgelehnt.
    Das Event dafür heisst "_Validating".
    Gut wäre dabei, wenn eine gültige Voreinstellung voreingestellt wäre, damit man nicht angemeckert wird, wenn man eine Textbox betritt und ohne Eingabe wieder verlassen will.
    Zwischen Validating und Validated gibt es aber einen Unterschied. Du hast jetzt einen EventHandler, der mit Handles TextBox1.Validated somit ans Validated-Event gebunden ist. Deine Sub heißt aber TextBox1_Validating. Mit der Benennung schießt Du Dir ins eigene Knie.
    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.

    VaporiZed schrieb:

    Mit der Benennung schießt Du Dir ins eigene Knie.

    Danke für den Hinweis.

    Habe jetzt
    Private Sub TextBox1_Validated(sender As System.Object, e As System.EventArgs) Handles TextBox1.Validated
    und
    Private Sub TextBox2_Validating(sender As System.Object, e As System.EventArgs) Handles TextBox2.Validating
    bemerke beim Testen aber keinen Unterschied.
    Den sprachlichen Unterschied begreife ja sogar ich mit meinem schlechten Englisch, aber was läuft da Programmtechnisch anders?
    @Elephant Eine einzelne Zeile ist noch kein Sourcecode. ;)
    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!
    Du solltest dich mal vermehrt mit der Funktionalität der IDE beschäftigen !
    Intellicense und Co. bieten jede menge Hilfestellungen !

    ErfinderDesRades schrieb:

    Jo, damit bist du auf dem richtigen Weg.

    Danke

    Wenn ich dich richtig verstanden habe, kann man die Validierung noch canceln.
    Das, wenn man von der TextBox aufs X zum Programm schließen geht noch die Validierung abgearbeitet wird lässt sich vermutlich nicht verhindern, oder?
    Ist für das geplante Programm egal, nur rein interessehalber.
    Denn dazu wie ich die Validierung Cancel konnte ich nichts finden um zu probieren.
    ganz easy:

    VB.NET-Quellcode

    1. Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    2. If Not Integer.TryParse(TextBox1.Text, Nothing) Then e.Cancel = True
    3. End Sub

    Also: Wenn der TextBox-Text nicht in ne Ganzzahl umgewandelt werden kann, dann Validierung abbrechen und den User zu einer besseren Eingabe »auffordern«. Das bedeutet, dass der User die TextBox nicht verlassen kann, solange da keine Ganzzahl drinsteht. Auch nicht, um das rote Fenster-Schließen-[X] zu klicken. Denn die Validierung findet immer dann statt, wenn der User das Control verlassen will.
    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.

    VaporiZed schrieb:

    Das bedeutet, dass der User die TextBox nicht verlassen kann

    Danke, ich war da auf einem ganz falschen Dampfer.
    Jetzt habe ich das verstanden.

    tragl schrieb:

    IsNumeric gibt's aber doch auch noch...

    Das Ursprungsthema war das, wenn man bei Importierte Namespaces Microsoft.VisualBasic rausnimmt, um alten VB6 Kram zu vermeiden, kennt er IsNummeric nicht mehr.
    Einfach mal die Beiträge von vorne überfliegen.
    Als Generalimport rausnehmen ist auf jeden Fall empfehlenswert.
    In diesem Fall, würde ich nur in der Klasse importieren und es trotzdem verwenden, denn manchmal ist der Namespace doch zu gebrauchen.
    Richtlinien und Regeln sind ja schöhn und gut, aber zu dogmatisch sollte man es auch nicht betrachen, sonst steht man auf seinen eigenen Füßen.

    Haudruferzappeltnoch schrieb:

    Ich stell mir das gerade bissle komisch vor aus einer Textbox nicht rauszukommen.
    Mit folgendem Beispiel isses vielleicht nachvollziehbarer mit dem Nicht-Verlassen-Können-Szenario: eine TextBox mit der Beschriftung »bitte 8-stellige PIN eingeben (nur Ziffern)«, dazu folgender Code:

    VB.NET-Quellcode

    1. Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
    2. If TextBox1.Text.Length = 0 Then MessageBox.Show("Nee nee, ohne PIN-Eingabe geht's hier nicht weiter …") : e.Cancel = True : Return
    3. If Not Integer.TryParse(TextBox1.Text, Nothing) Then MessageBox.Show("Was ist an »nur Ziffern« nicht zu verstehen?") : e.Cancel = True : Return
    4. If TextBox1.Text.Length <> 8 Then MessageBox.Show("Was ist an »8-stellig« nicht zu verstehen?") : e.Cancel = True : Return
    5. 'und hier dann Prüfung der PIN
    6. End Sub

    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.

    Elephant schrieb:

    Das, wenn man von der TextBox aufs X zum Programm schließen geht noch die Validierung abgearbeitet wird lässt sich vermutlich nicht verhindern, oder?
    Hmm.
    Habe dafür nun diese Lösung:

    VB.NET-Quellcode

    1. Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
    2. If ActiveControl Is sender Then e.Cancel = False : Return
    3. 'ab hier wirklich validieren
    4. '...
    5. End Sub
    Also wenn er validiert, aber immer noch selbst das ActiveControl ist (also obwohl er garnet den Focus gewechselt hat), dann bedeutet das, dass das Form als ganzes schliesst.

    Elephant schrieb:

    Die möglichen Zahlen sind aber mehr als 8, meine es ist angenehmer, wenn man da einfach flüssig was eingibt.
    Wenn du mehrere zusammenhängende Textboxen hast, wo nur Zahlen eingegeben werden sollen...
    Dann kann man auch gleich beim Tastendruck die Eingabe auf Zahlen validieren und bei definierter Anzahl Zeichen auf die nächste Textbox springen...
    Dazu genügt schon eine einfache benutzedefinierte Textbox: (siehe Beispiel unten)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <DefaultEvent("EndOfInputReached")>
    3. Class MyTextBox : Inherits TextBox
    4. Private allowedButtons As New List(Of Char) From {"0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c}
    5. Public Event EndOfInputReached As EventHandler(Of EndOfInputReachedEventArgs)
    6. Protected Sub OnEndOfInputReached(ByVal e As EndOfInputReachedEventArgs)
    7. RaiseEvent EndOfInputReached(Me, e)
    8. End Sub
    9. Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
    10. MyBase.OnKeyPress(e)
    11. Dim _isEndOfInput = (Me.Text.Length = Me.MaxLength)
    12. Dim _isAllowedButton = allowedButtons.Contains(e.KeyChar)
    13. If e.KeyChar <> Microsoft.VisualBasic.vbBack Then
    14. If Not _isAllowedButton Then Media.SystemSounds.Beep.Play()
    15. e.Handled = Not (_isAllowedButton OrElse _isEndOfInput)
    16. End If
    17. If _isEndOfInput AndAlso _isAllowedButton Then
    18. Dim _SelectionStart = Me.SelectionStart
    19. If _SelectionStart = Me.MaxLength Then
    20. OnEndOfInputReached(New EndOfInputReachedEventArgs(e.KeyChar))
    21. Else
    22. Dim lastChar = Me.Text.Last
    23. Me.Text = Me.Text.Remove(Me.Text.Length - 1)
    24. Me.Text = Me.Text.Insert(_SelectionStart, e.KeyChar)
    25. OnEndOfInputReached(New EndOfInputReachedEventArgs(lastChar))
    26. End If
    27. End If
    28. End Sub
    29. End Class
    30. Public Class EndOfInputReachedEventArgs : Inherits EventArgs
    31. Public ReadOnly LastCharacter As Char
    32. Public Sub New(ByVal lastCharacter As Char)
    33. Me.LastCharacter = lastCharacter
    34. End Sub
    35. End Class
    Und diese verwendest du folgend in einer Form:
    Die Textboxen kannst du mit der MaxLength-Property im Formsdesigner entsprechend begrenzen...

    VB.NET-Quellcode

    1. Public Class Main
    2. Private Sub MyTextBox1_EndOfInputReached(sender As Object, e As EndOfInputReachedEventArgs) _
    3. Handles MyTextBox1.EndOfInputReached, MyTextBox2.EndOfInputReached, MyTextBox3.EndOfInputReached, MyTextBox4.EndOfInputReached
    4. Dim tbx = DirectCast(sender, MyTextBox)
    5. If tbx Is MyTextBox1 Then SetFocus(MyTextBox2, e.LastCharacter)
    6. If tbx Is MyTextBox2 Then SetFocus(MyTextBox3, e.LastCharacter)
    7. If tbx Is MyTextBox3 Then SetFocus(MyTextBox4, e.LastCharacter)
    8. End Sub
    9. Private Sub SetFocus(tbx As MyTextBox, lastCharacter As Char)
    10. tbx.Text = lastCharacter
    11. tbx.Focus()
    12. tbx.SelectionStart = 1
    13. End Sub
    14. End Class​

    ErfinderDesRades schrieb:

    Also wenn er validiert, aber immer noch selbst das ActiveControl ist (also obwohl er garnet den Focus gewechselt hat), dann bedeutet das, dass das Form als ganzes schliesst.

    Danke für die Lösung, werde ich verwenden, auch wenn es nicht nötig wäre. So ist es eine Vernünftige Lösung und nicht das was ich gemacht hätte.

    VB1963 schrieb:

    Wenn du mehrere zusammenhängende Textboxen hast, wo nur Zahlen eingegeben werden sollen...

    Es sind entweder Zahlen, 1 Buchstabe und eine Zahl, ein Buchstabe oder zwei Buchstaben (Bei den Buchstaben nur bestimmte erlaubt).
    Ich lasse den Benutzer einfach Tippen und meckere dann nachher, wenn es nicht richtig ist.