1

因此,我在 vb.net 中进行了聊天(使用 FTP 服务器),我想为聊天中的每个名称着色,因此带有消息的文件如下所示:

#2George: HI
#2George: Hi geoo

并使用RichTextBox1 textchanged我添加的事件:

For Each line In RichTextBox1.Lines
    If Not line Is Nothing Then
        If line.ToString.Trim.Contains("#2") Then
            Dim s$ = line.Trim
            RichTextBox1.Select(s.IndexOf("#") + 1, s.IndexOf(":", s.IndexOf("#")) - s.IndexOf("#") - 1)
            MsgBox(RichTextBox1.SelectedText)
            RichTextBox1.SelectionColor = Color.DeepSkyBlue
        End If
    End If
Next

第一个名字(乔治)改变了他的颜色,但第二个没有。

任何想法为什么会发生这种情况?

4

1 回答 1

0

主要问题是您的 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
于 2013-08-29T15:55:36.013 回答