none
TextBox.Text zur Eingabe markieren RRS feed

  • Frage

  • Hallo an Alle,

    1.)  wie kann man einen Maus-Doppel-Click auf ein TextBox-Feld  kodieren ?


    Nach Doppel-Click mit der Maus erscheint der alte Text negativ dargestellt (reversed)
    und wird sofort von der neuen Eingabe überschrieben.

    if NOT 1.)  then bitte
    2.)  wo kann ich in der Online-Hilfe suchen

    Danke für eine Antwort

    und viele Grüße
    Peter

    Donnerstag, 4. Februar 2010 11:18

Antworten

  • Hallo Peter,

    ein Doppelklick selektiert bei einer Textbox das Wort in dem der Cursor steht,
    nicht die gesamten Inhalt - was man nur sieht wenn man mehrere Worte hat.

    Da Du aber vermutlich alles selektieren willst, wäre ein SelectAll das schmerzloseste.
    Nur funktioniert so etwas nicht im KeyDown/KeyPress, da Du Dich dort in der Eingabeschleife
    befindest und die Anzeige durch die nächste Eingabe wieder verändert wird.

    Nicht nur deswegen, was Deine Eingaberoutine angeht:
    Prüfen solltest Du weniger im KeyPress, dort bestenfalls auf numerische Angaben prüfen,
    siehe z. B.: Gewusst wie: Erstellen eines numerischen Textfelds
    denn ansonsten machst Du es dem Benutzer schwer, Eingaben zu korrigieren.
    Ausserdem wirst Du schnell durch Funktionen wie Copy und Paste ausgetrickst.

    Eine Überprüfung sollte im Validating Ereignis stattfinden. Das koopiert auch mit
    den anderen Dingen wie der Datenbindung.
    Und hier wäre das SelectAll angebracht, wenn Deine Prüfung fehlerhaft ausfällt.
    Besser als CSng wäre im übrigen:
    If Not Double.TryParse(Tb25.Text, sb_Gew) Then
           MessageBox.Show("Keine numerische Eingabe")
           Tb25.SelectAll()
    End If
    (wie gesagt, ausserhalb von KeyPress, KeyDown...)

    Zu den Farben:
    Eine Standard-Textbox kennt nur jeweils eine Vordergrund (ForeColor) und Hintergrundfarbe (BackColor).
    Die kannst Du zur Laufzeit wechseln (um z. B. Rot für negative Werte anzuzeigen).
    Willst Du mehrere unterschiedliche Farben darstellen brauchst Du eine RichTextBox.

    Gruß Elmar

    Donnerstag, 4. Februar 2010 16:40
    Beantworter
  • Hallo Peter,

    mit der SelectAll Methode kannst Du den gesamten Text markieren. Die Darstellung variiert natürlich je nach Farbschema des Benutzers, sowie ob die TextBox gerade den Fokus hat. Damit die Markierung auch sichtbar ist, wenn die TextBox gerade nicht den Eingabefokus hat, muss man die HideSelection Eigenschaft auf False setzen:

      Private Sub Button1_Click(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs _
                                      ) Handles Button1.Click
    
        TextBox1.HideSelection = False
        TextBox1.SelectAll()
        TextBox1.Select()
      End Sub

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Donnerstag, 4. Februar 2010 12:40
    Moderator

Alle Antworten

  • Hallo Peter,

    in Windows Forms ist alles Event-gesteuert, es gibt natürlich auch das Event MouseDoubleClick.
    Eine Textbos verhält sich bereits, wie Du es beschrieben hast; willst Du es ändern, kannst Du die Selection... Prooperties verwenden.


        Private Sub TextBox1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick

            Me.TextBox1.SelectionStart = 0

            Me.TextBox1.SelectionLength = 0

        End Sub


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 4. Februar 2010 11:36
  • Hallo Olaf,
    besten Dank für Deine schnelle Reaktion, aber . .

    ich suche den VB-Code, der den selben Effekt hat wie ein DoubleClick mit der Maus.

    MEine TextBox ist bereits ge-Entert, 
    jetzt soll der angezeigte Wert negativ (reversed)
    = weißer Text auf d'blauem Grund angezeigt werden.

    Danke für den nxt Tipp
    Peter
    Donnerstag, 4. Februar 2010 11:53
  • Hallo Peter

    Um den Text Negativ darstellen gebe ich Dir zwei Beispiele:


    Public Class Form1
    
    Private Sub TextBox1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick
            Me.TextBox1.SelectionStart = 0
            Me.TextBox1.SelectionLength = 0
    
            Me.TextBox1.Text = StrReverse(Me.TextBox1.Text)
    
    End Sub
    
    
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            Dim strOrgText As String
            Dim strRevText As [Char]()
            Dim array As Array
    
            strOrgText = Me.TextBox1.Text
            strRevText = strOrgText.ToCharArray
            array.Reverse(strRevText)
            Me.TextBox1.Text = strRevText
    
        End Sub
    End Class




    Artikeln:

    StrReverse-Funktion (Visual Basic) à http://msdn.microsoft.com/de-de/library/e462ax87.aspx

    Array.Reverse-Methode à http://msdn.microsoft.com/de-de/library/d3877932.aspx


    Control.MouseDoubleClick-Ereignis à http://msdn.microsoft.com/de-de/library/system.windows.forms.control.mousedoubleclick.aspx

    Grüße,

     

    Robert

    Donnerstag, 4. Februar 2010 11:57
    Moderator
  • Hallo Peter,

    mit der SelectAll Methode kannst Du den gesamten Text markieren. Die Darstellung variiert natürlich je nach Farbschema des Benutzers, sowie ob die TextBox gerade den Fokus hat. Damit die Markierung auch sichtbar ist, wenn die TextBox gerade nicht den Eingabefokus hat, muss man die HideSelection Eigenschaft auf False setzen:

      Private Sub Button1_Click(ByVal sender As System.Object, _
                                ByVal e As System.EventArgs _
                                      ) Handles Button1.Click
    
        TextBox1.HideSelection = False
        TextBox1.SelectAll()
        TextBox1.Select()
      End Sub

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Donnerstag, 4. Februar 2010 12:40
    Moderator
  • Hallo Thorsten, hallo Olaf,

    Eure Tipps bringen mich meinem Ziel noch nicht näher.

    In einer Eingabe-Sub soll nach der Try/ catch -Abfrage das Textfeld genau so dastehen, als ob man einen Doppel-Click darauf gesetzt hätte: negativ, Cursor am Eingabe-Ende und bereit zur neuen Eingabe.

     

    Private Sub Tb25_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Tb25.KeyDown
            If e.KeyCode = Keys.Enter Then
                e.Handled = True
    
                Try
                    sb_Gew = CSng(Tb25.Text) ' Gewicht sGew
                Catch ex As Exception
                    Beep()
                    MsgBox("Eingabe prüfen!")
                End Try
    
                sb_Gew = CSng(Tb25.Text)
    
                Select Case sb_Gew
                    Case Is < 0.01
                        sb_Gew = 0.01
                        MsgBox("min. Gewicht sind 10 Gramm"
                    Case 0.01 To 1 ' --> "X,XXX" kg
                        sb_Gew = Format(sb_Gew, "0.000")
                    Case 1 To 9.99 ' --> "X,XX" kg    . . . .    es folgen weitere Cases
                        Format(sb_Gew, "#,##0")
                End Select
    
                sEing = sb_Gew
                ' (Tb25.Text)
                tFeld = DirectCast(sender, TextBox).Name
                Tb25.Text = sb_Gew.ToString ' Format(sEing, "0.000")
    
                Call Nachrechnen(sEing, tFeld)
            End If
        End Sub
    


    Nebenfrage: wie formatiert man hier an dieser Stelle den Text (Schriftgröße, -Farbe etc)?

    Viele Grüße
    Peter

    Donnerstag, 4. Februar 2010 16:00
  • Hallo Peter,

    ein Doppelklick selektiert bei einer Textbox das Wort in dem der Cursor steht,
    nicht die gesamten Inhalt - was man nur sieht wenn man mehrere Worte hat.

    Da Du aber vermutlich alles selektieren willst, wäre ein SelectAll das schmerzloseste.
    Nur funktioniert so etwas nicht im KeyDown/KeyPress, da Du Dich dort in der Eingabeschleife
    befindest und die Anzeige durch die nächste Eingabe wieder verändert wird.

    Nicht nur deswegen, was Deine Eingaberoutine angeht:
    Prüfen solltest Du weniger im KeyPress, dort bestenfalls auf numerische Angaben prüfen,
    siehe z. B.: Gewusst wie: Erstellen eines numerischen Textfelds
    denn ansonsten machst Du es dem Benutzer schwer, Eingaben zu korrigieren.
    Ausserdem wirst Du schnell durch Funktionen wie Copy und Paste ausgetrickst.

    Eine Überprüfung sollte im Validating Ereignis stattfinden. Das koopiert auch mit
    den anderen Dingen wie der Datenbindung.
    Und hier wäre das SelectAll angebracht, wenn Deine Prüfung fehlerhaft ausfällt.
    Besser als CSng wäre im übrigen:
    If Not Double.TryParse(Tb25.Text, sb_Gew) Then
           MessageBox.Show("Keine numerische Eingabe")
           Tb25.SelectAll()
    End If
    (wie gesagt, ausserhalb von KeyPress, KeyDown...)

    Zu den Farben:
    Eine Standard-Textbox kennt nur jeweils eine Vordergrund (ForeColor) und Hintergrundfarbe (BackColor).
    Die kannst Du zur Laufzeit wechseln (um z. B. Rot für negative Werte anzuzeigen).
    Willst Du mehrere unterschiedliche Farben darstellen brauchst Du eine RichTextBox.

    Gruß Elmar

    Donnerstag, 4. Februar 2010 16:40
    Beantworter
  • Vielen Dank, Elmar, für die ausführliche Antwort.

    Bin damit erst einmal berschäftig.

    Schönes Wochenende
    Peter
    Freitag, 5. Februar 2010 16:46