ElektroStudios
ElektroStudios

Reputation: 20464

RichTextbox - line length selection issue

I'm coding a little app where I can load a textfile to match regex:

enter image description here

I change the forecolor text based in the length of the matched line,

The problem is if a line is a multiline then it don't work as expected and selects only a half-part of the line, like for example the second line starting with "title", this:

Title   : Kirsty Maccoll - A New England: The Very Best of Kirsty Maccoll

You can see the problem here: enter image description here

But the weird thing is if I resize the form to let me see the full line, and then I retype the RegEx, then it works as expected and selects the entire line: enter image description here

I wan't to know how to resolve this problem without resizing the form.

This is the code I'm using to change the forecolor:

Private Sub MatchRegEx()
    Label_Matched_Value.Text = "0"
    Label_Missed_Value.Text = "0"

    If (TextBox_RegEx.Text = "" Or TextBox_RegEx.Text = TextBox_Hint) And RichTextBox_Strings.Text.Length = 0 Then
        Label_Info.Text = ""
        RichTextBox_Strings.Select(0, RichTextBox_Strings.Text.Length)
        RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
    ElseIf (TextBox_RegEx.Text = "" Or TextBox_RegEx.Text = TextBox_Hint) And RichTextBox_Strings.Text.Length > 0 Then
        Label_Info.Text = ""
        RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
    Else
        Try
            Label_Info.Text = "Valid RegEx"
            For i As Integer = 0 To RichTextBox_Strings.Lines.Length - 1
                If System.Text.RegularExpressions.Regex.IsMatch(RichTextBox_Strings.Lines(i), RegEx) Then
                    If Not RichTextBox_Strings.Focused Then
                        RichTextBox_Strings.Select(RichTextBox_Strings.GetFirstCharIndexFromLine(i), RichTextBox_Strings.Lines(i).Length)
                    End If
                    RichTextBox_Strings.SelectionColor = Color.LimeGreen
                    Label_Matched_Value.Text = CInt(Label_Matched_Value.Text) + 1
                Else
                    If Not RichTextBox_Strings.Focused Then
                        RichTextBox_Strings.Select(RichTextBox_Strings.GetFirstCharIndexFromLine(i), RichTextBox_Strings.Lines(i).Length)
                    End If
                    RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
                    Label_Missed_Value.Text = CInt(Label_Missed_Value.Text) + 1
                End If
            Next
        Catch ex As Exception
            Label_Info.Text = "Invalid RegEx"
            RichTextBox_Strings.SelectAll()
            RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
        End Try
    End If
End Sub

And the sample text:

Title   : The Upbeats - Primitive Technique
Genre   : Drum & Bass
Year    : 2013
Page    : http://www.mp3crank.com/the-upbeats/primitive-technique.htm
Download: http://potload.com/zj0scbxjuw90



Title   : Kirsty Maccoll - A New England: The Very Best of Kirsty Maccoll
Genre   : Folk, Pop
Year    : 2013
Page    : http://www.mp3crank.com/kirsty-maccoll/a-new-england-the-very-best-of-kirsty-maccoll.htm
Download: http://potload.com/ziixpepo07lu



Title   : Of Montreal - Young Froth / Taypiss
Genre   : Indie, Pop
Year    : 2013
Page    : http://www.mp3crank.com/of-montreal/young-froth-taypiss.htm
Download: http://potload.com/hyc4okxucnlu

UPDATE:

I've debugged the problem and the values are correct:

Line 0 - selected range: 43 length
Line 8 - selected range: 73 length
Line 16 - selected range: 45 length

Are the exact lines and length of the "Title" lines (WHEN FORM IS RESIZED TO SEE THE ENTIRE LINE).

UPDATE 2:

If I change the textfont of the richtextbox to a small font like 5pt (to show the entire line in the default form size) then all works as expected too..

So this problems seems to be like that when full line is shown as multiline because the entire line don't fit in the size of the form then it counts like more than one line?

How to resolve this?

UPDATE 3:

This is the full source if want to test it...

Public Class Form1

#Region " Vars / Properties "

    Dim TextBox_Hint As String = "Type your RegEx here..."
    Dim MatchRegEx_Flag As Boolean = True

    Public Property RegEx() As String
        Get
            Return TextBox_RegEx.Text
        End Get
        Set(ByVal value As String)
            TextBox_RegEx.Text = value
        End Set
    End Property

#End Region

#Region " Controls "

    ' TextBox RegEx [Enter/Leave]
    Private Sub TextBox_RegEx_Hint(sender As Object, e As EventArgs) Handles TextBox_RegEx.Enter, TextBox_RegEx.Leave
        If sender.Text = TextBox_Hint Then
            Label_Info.Text = ""
            sender.text = ""
        ElseIf sender.Text = "" Then
            sender.text = TextBox_Hint
            Label_Info.Text = ""
        End If
    End Sub

    ' TextBox RegEx [TextChanged]
    Private Sub TextBox_RegEx_TextChanged(sender As Object, e As EventArgs) Handles TextBox_RegEx.TextChanged
        If MatchRegEx_Flag Then
            MatchRegEx_Flag = False
            MatchRegEx()
            MatchRegEx_Flag = True
        End If

    End Sub

    ' Button Copy RegEx [Click]
    Private Sub Button_Copy_RegEx_Click(sender As Object, e As EventArgs) Handles Button_Copy_RegEx.Click
        Clipboard.SetText(TextBox_RegEx.Text)
    End Sub

    ' Button Copy Matches [Click]
    Private Sub Button_Copy_Matches_Click(sender As Object, e As EventArgs) Handles Button_Copy_Matches.Click
        Clipboard.SetText(" ")
        For i As Integer = 0 To RichTextBox_Strings.Lines.Length - 1
            If System.Text.RegularExpressions.Regex.IsMatch(RichTextBox_Strings.Lines(i), RegEx) Then
                RichTextBox_Strings.Select(RichTextBox_Strings.GetFirstCharIndexFromLine(i), RichTextBox_Strings.Lines(i).Length)
                Clipboard.SetText(Clipboard.GetText & vbNewLine & RichTextBox_Strings.SelectedText)
            End If
        Next
    End Sub

    ' Button Load [ Click]
    Private Sub Button_TextFile_Click(sender As Object, e As EventArgs) Handles Button_TextFile.Click
        Dim Textfile As New OpenFileDialog()
        Textfile.InitialDirectory = Environ("programfiles")
        Textfile.Title = "Load a text from file..."
        Textfile.Filter = "Text-files|*.txt"
        If Textfile.ShowDialog() = DialogResult.OK Then
            RichTextBox_Strings.SuspendLayout()
            RichTextBox_Strings.Text = My.Computer.FileSystem.ReadAllText(Textfile.FileName)
            RichTextBox_Strings.ResumeLayout()
        End If
    End Sub

    ' RichTextBox [MouseHover]
    Private Sub RichTextBox_Strings_MouseHover(sender As Object, e As EventArgs) Handles RichTextBox_Strings.MouseHover
        'sender.focus()
    End Sub

    ' RichTextBox [TextChanged]
    Private Sub RichTextBox_Strings_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox_Strings.TextChanged
        If MatchRegEx_Flag Then
            MatchRegEx_Flag = False
            MatchRegEx()
            MatchRegEx_Flag = True
        End If
    End Sub

#End Region

#Region " Procedures "

    Private Sub MatchRegEx()
        Label_Matched_Value.Text = "0"
        Label_Missed_Value.Text = "0"
        If (TextBox_RegEx.Text = "" Or TextBox_RegEx.Text = TextBox_Hint) And RichTextBox_Strings.Text.Length = 0 Then
            Label_Info.Text = ""
            RichTextBox_Strings.Select(0, RichTextBox_Strings.Text.Length)
            RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
        ElseIf (TextBox_RegEx.Text = "" Or TextBox_RegEx.Text = TextBox_Hint) And RichTextBox_Strings.Text.Length > 0 Then
            Label_Info.Text = ""
            RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
        Else
            Try
                Label_Info.Text = "Valid RegEx"
                For i As Integer = 0 To RichTextBox_Strings.Lines.Length - 1
                    If System.Text.RegularExpressions.Regex.IsMatch(RichTextBox_Strings.Lines(i), RegEx) Then
                        If Not RichTextBox_Strings.Focused Then
                            RichTextBox_Strings.Select(RichTextBox_Strings.GetFirstCharIndexFromLine(i), RichTextBox_Strings.Lines(i).Length)
                        End If
                        RichTextBox_Strings.SelectionColor = Color.LimeGreen
                        Label_Matched_Value.Text = CInt(Label_Matched_Value.Text) + 1
                    Else
                        If Not RichTextBox_Strings.Focused Then
                            RichTextBox_Strings.Select(RichTextBox_Strings.GetFirstCharIndexFromLine(i), RichTextBox_Strings.Lines(i).Length)
                        End If
                        RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
                        'MsgBox(RichTextBox_Strings.Lines(i))
                        Label_Missed_Value.Text = CInt(Label_Missed_Value.Text) + 1
                    End If
                Next
            Catch ex As Exception
                ' MsgBox(ex.Message)
                Label_Info.Text = "Invalid RegEx"
                RichTextBox_Strings.SelectAll()
                RichTextBox_Strings.SelectionColor = Color.FromArgb(248, 248, 242)
            End Try
        End If
    End Sub

#End Region

End Class

Upvotes: 2

Views: 1709

Answers (2)

user326608
user326608

Reputation: 2548

see Counting lines displayed by richtextbox in C# and http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.getlinefromcharindex.aspx.

alternatively, turn off wordwrap altogether, and allow the box to scroll horizontally.

Upvotes: 1

Civa
Civa

Reputation: 2176

i also face this problem does previously? disable the wordwrap property to rich text box may solve your problem :)

Upvotes: 2

Related Questions