【问题标题】:How to color the text of RichTextBox depending on the prefix of the string?如何根据字符串的前缀为 RichTextBox 的文本着色?
【发布时间】:2015-11-07 19:04:24
【问题描述】:

我想为richtextbox 中的所有字符串着色。例如,如果特定字符串的前缀是

  1. Received: 那么它应该是蓝色的
  2. Send: 那么它应该是红色的
  3. Info: 那么它应该是绿色的

*The way I output the text in the RichTextBox is by ascending order, it means that all the newest messages will be outputted at the top of the RichTextBox, the old ones will go down.

截图:

代码:

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim msg_info As String = Nothing

        If RB_Info.Checked = True Then
            msg_info = "Info: "
        End If
        If RB_Send.Checked = True Then
            msg_info = "Send: "
        End If
        If RB_Received.Checked = True Then
            msg_info = "Received: "
        End If

        RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
    End Sub
End Class

编辑:我试过应用这个子,但它改变了 ListBox 中所有项目的颜色

Sub HighlightPhrase(box As RichTextBox, phrase As String, color As Color)
        Dim pos As Integer = box.SelectionStart
        Dim s As String = box.Text
        Dim ix As Integer = 0
        While True
            Dim jx As Integer = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase)
            If jx < 0 Then
                Exit While
            End If
            box.SelectionStart = jx
            box.SelectionLength = phrase.Length
            box.SelectionColor = color
            ix = jx + 1
        End While
        box.SelectionStart = pos
        box.SelectionLength = 0
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim msg_info As String = Nothing

        If RB_Info.Checked = True Then
            msg_info = "Info: "
            HighlightPhrase(RichTextBox1, "Info", Color.Blue)
        End If
        If RB_Send.Checked = True Then
            msg_info = "Send: "
            HighlightPhrase(RichTextBox1, "Send", Color.Green)
        End If
        If RB_Received.Checked = True Then
            msg_info = "Received: "
            HighlightPhrase(RichTextBox1, "Received", Color.Red)
        End If
        RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
    End Sub

【问题讨论】:

    标签: vb.net richtextbox


    【解决方案1】:

    我已经编辑了我的解决方案,所以新行出现在 RichTextBox 的顶部。

    我认为我的解决方案很难看,因为基本上它会在添加新行后重新绘制每行的颜色。想象一下,如果 RichTextBox 有数千行。我认为您可以通过限制 RTB 中的行数(例如 100 行)来最小化这种情况。

    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim msg_info As String = Nothing
    
            If RB_Info.Checked = True Then
                msg_info = "Info: "
            End If
            If RB_Send.Checked = True Then
                msg_info = "Send: "
            End If
            If RB_Received.Checked = True Then
                msg_info = "Received: "
            End If
    
            RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info & TextBox1.Text & ControlChars.NewLine)
            ChangeColor()
    
        End Sub
    
        Private Sub ChangeColor()
    
            Dim lines = RichTextBox1.Text.Split(vbLf)
            Dim startPos As Integer, endPos As Integer = -1
            Dim myColor As Color
    
            For i = 0 To lines.Length - 2 ' minus 2 because the last one is empty string
                startPos = endPos + 1
                endPos = startPos + lines(i).Length
                RichTextBox1.Select(startPos, endPos)
    
                If lines(i).StartsWith("Info: ") Then myColor = Color.Red
                If lines(i).StartsWith("Send: ") Then myColor = Color.Blue
                If lines(i).StartsWith("Received: ") Then myColor = Color.Green
    
                RichTextBox1.SelectionColor = myColor
            Next
    
        End Sub
    
    End Class
    

    使用 ListView 的替代解决方案

    您可能想查看 ListView 控件。如果您不想在列表中写任何内容,我建议您将 RichTextBox 替换为 ListView。添加 ListView 后,将 View 属性更改为 List

    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    
            Dim msg_info As String = Nothing
            Dim myColor As Color
    
            If RB_Info.Checked = True Then
                msg_info = "Info: "
                myColor = Color.Green
            End If
            If RB_Send.Checked = True Then
                msg_info = "Send: "
                myColor = Color.Red
            End If
            If RB_Received.Checked = True Then
                msg_info = "Received: "
                myColor = Color.Blue
            End If
    
            Dim li = New ListViewItem()
            li.ForeColor = myColor
            li.Text = msg_info & TextBox1.Text
            ListView1.Items.Insert(0, li)
    
        End Sub
    
    End Class
    

    【讨论】:

    • 是的,这很棒。唯一遗漏的是 RichTextBox 应该在 RichTextBox 的上部输出新文本。像这样RichTextBox1.Text = RichTextBox1.Text.Insert(0, msg_info &amp; TextBox1.Text &amp; ControlChars.NewLine)
    猜你喜欢
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2020-08-16
    • 2011-04-15
    • 2015-11-04
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多