Per Button-Klick in eine Textbox schreiben oder einzelne Zeichen daraus löschen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von FatFire.

    Per Button-Klick in eine Textbox schreiben oder einzelne Zeichen daraus löschen

    Hallo zusammen

    ich programmiere derzeit eine Anwendung die später über einen TouchScreen gesteuert werden soll.
    Für die Eingabe von Geldbeträgen (z.B. Briefporto) habe ich in einer WindowsForm die Buttons 0 - 9, einen Button mit dem "," und einen "Del"-Button.

    Folgendermaßen schien es mir sinnvoll, einzelne Zahlen/Zeichen nacheinander in die Textbox einzufügen:

    VB.NET-Quellcode

    1. Public Class EingabePortoBrief
    2. Private i As Integer
    3. Private Sub EingabePortoBrief_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. i = 0
    5. End Sub
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. TextBoxPortokosten.Text.Insert(i, "1")
    8. i = i + 1
    9. End Sub
    10. End Class


    Das klappt aber nicht!
    Bekomme folgende Fehlermeldung:

    Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein. Parametername: startIndex

    Wie erreiche ich, dass ich über die Buttons 0 -9 und den ","-Button die Zeichen nacheinander in die Textbox schreiben und mit dem "Del"-Button jeweils das letzte existierende Zeichen
    in der Textbox löschen kann?

    Vielen Dank im Voraus
    So, ich hab mal krasses Beispiel gebaut, guckst Du hier, brauchst nur Form mit TableLayoutPanel (genannt TableLayoutPanel1) mit drei Spalten und fünf Zeilen, in oberste Zeile ist Textbox mit Namen TextBox1...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. CreateButtons()
    4. End Sub
    5. Public Sub EventHandler(ByVal Sender As System.Windows.Forms.Button, ByVal e As System.EventArgs)
    6. Dim Text As String = TextBox1.Text
    7. If Sender.Text = "Entf" Then
    8. TextBox1.Text = Text.Remove(Text.Length - 1)
    9. ElseIf Sender.Text = "," Then
    10. ' Komma soll nicht am Anfang oder doppelt stehen
    11. If Not Text = String.Empty AndAlso _
    12. Not Text.Contains(",") Then
    13. TextBox1.Text = Text & ","
    14. End If
    15. Else
    16. TextBox1.Text = Text & Sender.Text
    17. End If
    18. End Sub
    19. Private Function GetButton(ByVal Caption As String) As Button
    20. Dim Button As New Button
    21. Button.Text = Caption
    22. Button.Dock = DockStyle.Fill
    23. AddHandler Button.Click, AddressOf EventHandler
    24. Return Button
    25. End Function
    26. Private Sub CreateButtons()
    27. Dim Column As Integer
    28. Dim Row As Integer
    29. Dim Button As Button
    30. For i As Integer = 1 To 9
    31. ' Position im TableLayout bestimmen
    32. Column = (i - 1) Mod 3
    33. Row = ((i + 1) / 3)
    34. Button = GetButton(i.ToString)
    35. TableLayoutPanel1.Controls.Add(Button, Column, Row)
    36. Next
    37. ' Besondere Tasten einfügen
    38. TableLayoutPanel1.Controls.Add(GetButton("0"), 0, 4)
    39. TableLayoutPanel1.Controls.Add(GetButton(","), 1, 4)
    40. TableLayoutPanel1.Controls.Add(GetButton("Entf"), 2, 4)
    41. End Sub
    42. End Class

    Hach, ich bin ja so Java-Geschädigt :D
    Da benutzt Du nur einen einzigen Handler um alle Buttons abzuhandeln und Buttonerstellung wird programmatisch gelöst, spart viel Klickerei.

    Gruß FatFire
    wenn du sender verwendest, konvertiere es doch bitte noch mit CType in einen Button, sonst wirst du wenn du "richtig" programmierst(Option Strict On) probleme bekommen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hups...voll vergessen. Aber wenn wir es schon so genau nehmen, dann benutz doch bitte nicht CType, sondern DirectCast, das ist performanter und wir nutzen den Handler ja nur für Buttons, eine zusätzliche Prüfung ist also unnötig :P

    VB.NET-Quellcode

    1. Public Sub EventHandler(ByVal Sender As System.Object, ByVal e As System.EventArgs)
    2. Dim Button As Button = DirectCast(Sender, Button)
    3. Dim Text As String = TextBox1.Text
    4. If Button.Text = "Entf" Then
    5. TextBox1.Text = Text.Remove(Text.Length - 1)
    6. ElseIf Button.Text = "," Then
    7. ' Komma soll nicht am Anfang oder doppelt stehen
    8. If Not Text = String.Empty AndAlso _
    9. Not Text.Contains(",") Then
    10. TextBox1.Text = Text & ","
    11. End If
    12. Else
    13. TextBox1.Text = Text & Button.Text
    14. End If
    15. End Sub


    Ach, und mit Option Strict On auch

    VB.NET-Quellcode

    1. Row = ((i + 1) / 3)
    2. ' ersetzen durch
    3. Row = Convert.ToInt32((i + 1) / 3)


    Gruß FatFire

    Edit: Hab CInt noch durch Convert.ToInt32 ersetzt...auch nochmal wegen der Geschwindigkeit :thumbsup: