主要问题是您的 IndexOf 计算正在使用当前行的索引,但您没有将该索引转换为 RichTextBox 中使用该行的位置。也就是说,您的第二行#2George: Hi geoo
是为 # 符号找到索引 0,但 RichTextBox 中的索引 0 是指该行#2George: HI
,因此您每次都不断重绘第一行。
要解决眼前的问题:
For i As Integer = 0 To RichTextBox1.Lines.Count - 1
Dim startIndex As Integer = RichTextBox1.Text.IndexOf("#", _
RichTextBox1.GetFirstCharIndexFromLine(i))
If startIndex > -1 Then
Dim endIndex As Integer = RichTextBox1.Text.IndexOf(":", startIndex)
If endIndex > -1 Then
RichTextBox1.Select(startIndex, endIndex - startIndex)
RichTextBox1.SelectionColor = Color.DeepSkyBlue
End If
End If
Next
下一个问题是在 TextChanged 事件中执行此操作会一直重新绘制所有线条。这不会很好地扩展。在将文本添加到控件之前,请考虑使用预格式化的 RTF 行绘制文本。像这样的东西:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
AddRTFLine("#2George", "Hi")
AddRTFLine("#2George", "Hi geoo")
End Sub
Private Sub AddRTFLine(userName As String, userMessage As String)
Using box As New RichTextBox
box.SelectionColor = Color.DeepSkyBlue
box.AppendText(userName)
box.SelectionColor = Color.Black
box.AppendText(": " & userMessage)
box.AppendText(Environment.NewLine)
box.SelectAll()
RichTextBox1.Select(RichTextBox1.TextLength, 0)
RichTextBox1.SelectedRtf = box.SelectedRtf
End Using
End Sub