Reputation: 20464
I'm coding a little app where I can load a textfile to match regex:
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:
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:
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
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
Reputation: 2176
i also face this problem does previously? disable the wordwrap
property to rich text box may solve your problem :)
Upvotes: 2