TextBox.SelectionStart Problem

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

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

    TextBox.SelectionStart Problem

    Hi nochmal,
    ich hab noch ein anderes Problem.
    In dieser Anwendung (läuft auf einem Touch Bildschirm am Eingang) habe ich eine OnScreenTastatur (User Control) um Daten zu erfassen.
    Nun habe ich ein Event um die Tastenanschläge in die Textboxen zu schreiben (KeyPressed).
    Der Code dazu sieht so aus:

    VB.NET-Quellcode

    1. Private Sub touchKB_KeyPressed(var As String) Handles touchKB.KeyPressed
    2. Dim tb As TextBox = TryCast(scForeign.ActiveControl, TextBox)
    3. If tb IsNot Nothing Then
    4. tb.Text &= var
    5. tb.SelectionStart = tb.TextLength
    6. End If
    7. End Sub

    Das funktioniert auch bestens.
    Nun ist es so, das wenn jemand sich vertippt hat und den Cursor in der Textbox an eine andere Position stellt und dann versucht weiter zu schreiben, das die Zeichen dann wieder ans Ende gestellt werden. (ist eigentlich Klar weil tb.SelectionStart = tb.TextLength )
    Nur, wie kann ich das umgehen?
    Also so eine Art "Schreibe nicht immer ans Ende, sondern immer an der jetzigen Cursorposition der Textbox weiter"
    "Hier könnte Ihre Werbung stehen..."
    @VB1963 Danke Dir. Das ist mir klar das ich die mit SelectionStart die Position habe. Nur ist mir nicht Klar, wie ich die in diesem Zusammenhang ändern soll.
    Es gibt ja keine Tastatur oder Maus, sondern lediglich mein UserControl welches ein TouchKeyBoard ist.
    mit tb.Text &= var hänge ich ja jedes gedrückte Zeichen immer dran.
    Wenn ich nun aber mit dem Finger in die Textbox klicke an eine Position mitten im Text und dann ein Zeichen einfüge wird es trotzdem an den Schluss gehängt.
    Dieses "Mit dem Finger rein klicken" bekomme ich nicht abgefangen bzw. wenn ich selectionStart anders setze schreibt er trotzdem hinten dran. (ich denke wegen &= var).

    Die Signatur ist so, weils ja ein Event des UserControls ist.

    VB.NET-Quellcode

    1. Public Event KeyPressed(ByVal var As String)


    EDIT:
    zum besseren Verständnis hier noch ein Screenshot der Anwendung
    "Hier könnte Ihre Werbung stehen..."

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

    Ich meinte das eigentlich so (aus dem Kopf ungetestet geschrieben):

    VB.NET-Quellcode

    1. Private Sub touchKB_KeyPressed(var As String) Handles touchKB.KeyPressed
    2. Dim tb As TextBox = TryCast(scForeign.ActiveControl, TextBox)
    3. If tb Is Nothing Then Return
    4. If tb.SelectionStart < tb.Text.Length Then
    5. 'hier liegt der Cursor innerhalb des Textes
    6. tb.Text = ...
    7. Else
    8. tb.Text &= var
    9. End If
    10. tb.SelectionStart = tb.TextLength
    11. End Sub
    Hi @VB1963
    ich dämel. Ich hab mich die ganze Zeit darauf fest gebissen den Cursor per Event zu setzen.
    Das es soo einfach ist hab ich glatt übersehen
    Danke Dir

    Edit: grad erst gesehn @ErfinderDesRades.
    Probier ich aus. Wobei var ja immer nur das Zeichen des gerade gedrückten Knopps enthält und die ganzen Zeichen muss ich ja aneinander hängen, daher &=var
    "Hier könnte Ihre Werbung stehen..."
    Moin,
    Ich habs geschafft. *freu*
    Erst hab ich den Code von @VB1963 her genommen.
    Das funktionierte soweit sehr gut, allerdings hatte ich das Problem mit der .SelectionStart, denn der Cursor sprang immer wieder ans Ende.
    Am Ende kam dieser Code dabei raus, der bestens funktioniert:

    VB.NET-Quellcode

    1. Dim tb As TextBox = TryCast(scForeign.ActiveControl, TextBox)
    2. If tb Is Nothing Then Return
    3. If tb.SelectionStart < tb.Text.Length Then
    4. tb.SelectedText = var
    5. tb.SelectionStart = tb.SelectionStart
    6. Else
    7. tb.Text &= var
    8. tb.SelectionStart = tb.Text.Length
    9. End If


    Dann hab ich mir SelectedText genauer angeschaut (OB) und den Code so abgekürzt:

    VB.NET-Quellcode

    1. Dim tb As TextBox = TryCast(scForeign.ActiveControl, TextBox)
    2. If tb IsNot Nothing Then
    3. tb.SelectedText = var
    4. End If


    Funktioniert perfekt...
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    VB.NET-Quellcode

    1. tb.SelectionStart = tb.SelectionStart
    42 = 42 :?:
    Vielleicht setzt Du die .SelectionLength sauber auf 0 (Null).
    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!