Warum erscheint diese MsgBox doppelt?

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Warum erscheint diese MsgBox doppelt?

    Guten Tag ich hab mich extra hier registriert um diese Frage zu stellen:

    Ich habe eine "TextBox1", in die man nur Zahlen reinschreiben kann. Wenn jemand aber trotzdem Buchstaben oder ähnliches tippt, dann erscheint eine Meldung:
    "Bitte nur Zahlen eingeben"



    Aus einem mir unerklärlichen Grund erscheint diese MsgBox doppelt. ?(














    VB.NET-Quellcode

    1. Public Class Form2
    2. #Region "Only Accept Numbers"
    3. Private Declare Function GetAsyncKeyState Lib "user32" (ByVal ekey As Integer) As ShortSub OnlyAcceptNumbers()
    4. If GetAsyncKeyState(Keys.D1) Then
    5. ElseIf GetAsyncKeyState(Keys.D2) Then
    6. ElseIf GetAsyncKeyState(Keys.D3) Then
    7. ElseIf GetAsyncKeyState(Keys.D4) Then
    8. ElseIf GetAsyncKeyState(Keys.D5) Then
    9. ElseIf GetAsyncKeyState(Keys.D6) Then
    10. ElseIf GetAsyncKeyState(Keys.D7) Then
    11. ElseIf GetAsyncKeyState(Keys.D8) Then
    12. ElseIf GetAsyncKeyState(Keys.D9) Then
    13. ElseIf GetAsyncKeyState(Keys.NumPad1) Then
    14. ElseIf GetAsyncKeyState(Keys.NumPad2) Then
    15. ElseIf GetAsyncKeyState(Keys.NumPad3) Then
    16. ElseIf GetAsyncKeyState(Keys.NumPad4) Then
    17. ElseIf GetAsyncKeyState(Keys.NumPad5) Then
    18. ElseIf GetAsyncKeyState(Keys.NumPad6) Then
    19. ElseIf GetAsyncKeyState(Keys.NumPad7) Then
    20. ElseIf GetAsyncKeyState(Keys.NumPad8) Then
    21. ElseIf GetAsyncKeyState(Keys.NumPad9) Then
    22. Else
    23. TextBox1.Clear()MsgBox("Bitte nur Zahlen eingeben", MsgBoxStyle.OkOnly, "Fehler") 'Warum kommt die MsgBox 2x ?
    24. End If
    25. End Sub
    26. #End Region   
    27. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    28. OnlyAcceptNumbers()
    29. End Sub
    30.  
    31.  
    32.  
    33.  
    Wäre ein NumericUpDown nicht vielleicht passender?
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Ich verwende bei sowas immer das hier:
    Denn auf dauer nervt es wenn man immer diese Fehlermeldung wegklicken muss.


    VB.NET-Quellcode

    1. Private Sub _KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    2. Select Case e.KeyChar
    3. Case CChar("48") To CChar("57"), CChar("8"), CChar("46") 'Zahlen, Backspace und Delete zulassen
    4. Case Else 'alle anderen Eingaben verbieten
    5. e.Handled = True
    6. End Select
    7. End Sub
    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."
    Dein Code funktioniert allgemein nicht im geringsten. a) Wieso GetAsyncKeyState für sowas?? b) Wenn er 1 und a gleichzeitig drückt fängt das dein Programm nicht ab. c) ist einfach jede Lösung schöner als deine: stackoverflow.com/questions/46…that-only-accepts-numbers.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hi
    lieber Char.IsControl und Char.IsDigit zulassen. Bei TextChanged dann alle Zahlen Char-weise ersetzen (SelectionStart eben ermitteln).

    VB.NET-Quellcode

    1. Public Shared Function SkipInvalidChars(ByVal input As String, ByVal isValidHandler As Func(Of Char, Boolean), ByRef selectionStart As Integer) As String
    2. Return SkipInvalidChars(input, Function(c, i) isValidHandler(c), selectionStart)
    3. End Function
    4. Public Shared Function SkipInvalidChars(ByVal input As String, ByVal isValidHandler As Func(Of Char, Integer, Boolean), ByRef selectionStart As Integer) As String
    5. Dim output As New System.Text.StringBuilder()
    6. Dim dest As Integer = selectionStart
    7. For i Is Integer = 0 To input.Length -1
    8. Dim c As Char = input(i)
    9. If isValidHandler(c, i) Then 'wenn der Char gültig ist, anhängen, sonst entfernen
    10. output.Append(c)
    11. ElseIf i < selectionStart Then
    12. dest -= 1 'selection start dekrementieren, wenn ein ungültiges Zeichen vor selectionStart auftritt
    13. End If
    14. Next
    15. selectionStart = dest
    16. Return output.ToString()
    17. End Function

    Aufruf wäre dann so:

    VB.NET-Quellcode

    1. With
    2. Dim selPos As Integer = .SelectionStart
    3. 'für Gleitkomma-Zahlen:
    4. '.Text = ReplaceInvalidChars(.Text, Function(c, i) Char.IsDigit(c) OrElse (c = "."c AndAlso i > 0), selPos)
    5. 'für Integer-Zahlen
    6. .Text = ReplaceInvalidChars(.Text, AddressOf Char.IsDigit, selPos)
    7. .SelectionStart = selPos
    8. End With


    Dein Code ist btw. leider komplett untauglich.

    Edit: grad noch das mit den Gleitkommazahlen eingefügt.

    Gruß
    ~blaze~
    Okay, um das zu klären: :wacko:

    Zuerst einmal: Danke für die vielen Antworten auf meine Noob-Frage
    Ich habe absolut NULL Erfahrung in Visual Basic...

    Den Quellcode habe nicht ich geschrieben, sondern von YouTube abgeschaut. Wenn jemand sich beschweren will, bitte hier: youtube.com/watch?v=6ZS8sVNT3mg :p

    PS: Ich bin 13 :)
    Ich würde dir von Youtube Tutorials abraten.
    Les lieber nen gescheites Buch.
    Der User hier ErfinderDesRades hat nen gutes Buch in seiner Signatur.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @Unihockey123:: Mach mal Option Strict On.
    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!