views:

11

answers:

2

Hi. I have a RichTextBox with an OnChanged event. The OnChanged event should look at each line in the RichTextBox and if the line is of prime length colour it red, otherwise colour it black. How do I do this? I think it is possible to select from index a to index b and set selection colour, but I think this will lose my cursor position. How do I also preserve cursor position? Thanks for any suggestions.

A: 

Hi. I did it like this:

Private Sub txtKeys_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtKeys.TextChanged
    Dim iStart As Int32 = txtKeys.SelectionStart
    Dim iPos As Int32 = 0
    For Each s As String In Split(txtKeys.Text, vbLf)
        If s.Length > 0 Then
            txtKeys.Select(iPos, iPos + s.Length)
            If isPrime(s.Length) Then
                txtKeys.SelectionColor = Color.GreenYellow
            Else
                txtKeys.SelectionColor = Color.Black
            End If
        End If
        iPos += s.Length + 1
    Next
    txtKeys.Select(iStart, 0)
End Sub

Sorry about the lack of comments! I imagine this will get massively inefficient when applied to a large .text property but this is not the intended use of the textbox.

El Ronnoco
+1  A: 

Look at SelectionStart and SelectionLength to select the text to highlight.

To keep the cursor position I think you can just store the current SelectionStart before you start highlighting and then reset it to that value after you've finished the highlighting.

Just be careful though if the user keeps typing while you're off highlighting. You'd probably have to intercept the keyboard events and cache them and then insert them after you've reset the SelectionStart to the correct location (or it might be easier, though less user friendly, to just ignore any keypresses while you're doing the highlighting).

ho1
Hi Thanks for your answer. I know it can get quite fiddly especially if the user has selected a chunk of text. For the purposes of my application I'm just assuming they have the caret in one position, not selecting a block. My solution seems to work well enough. Thanks.
El Ronnoco