在 RichTextBox 中查找并格式化字符串 Vb.NET

Find And Format String in RichTextBox Vb.NET

我正在与 Vb.NET 合作,要求是找到字符串 n RTF 控件并将其设置为粗体、斜体或任何颜色,我已经努力找到该字符串,但昨天我找到了它不符合我的要求。

在底部我会写完整的代码和测试数据。

我有一个简单的表单和两个控件,一个是用于 Select 不同测试用例的 CombBox 和一个用于显示文本的 RichTextBox。

 'Class Declarations

  Private FormattingApplied As Boolean = False
  Private SelectedBold As Boolean = False
  Private SearchText As String = String.Empty
  Private SelectedItalic As Boolean = False
  Private SelectedUnderLine As Boolean = False
  ' On Form Load
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    cmbList.Items.Add("Apple Pina Apple")
    cmbList.Items.Add("Apple Delicious Pineapple")
    cmbList.Items.Add("Apple Milk Shake Apa")
    cmbList.Items.Add("Apple Strawberry ")
    FormattingApplied = True
    SelectedBold = True
    cmbList.SelectedIndex = 0
 End Sub
 Function UppercaseFirstLetter(ByVal val As String) As String
    ' Test for nothing or empty.
    If String.IsNullOrEmpty(val) Then
        Return val
    End If
    Dim array() As Char = val.ToCharArray

    array(0) = Char.ToUpper(array(0))
    Return New String(array)
End Function
Private Sub ApplyFormatting(ByVal SearchText As String)
    Dim TrimmedString As String = String.Empty
    Dim ISTrimmed As Boolean = False
    If FormattingApplied Then
        Dim count As New List(Of Integer)()
        If rtfText.Text.Length >= 53 Then
            rtfText.Text = rtfText.Text.Substring(0, 50) + "..."
        End If

        For i As Integer = 0 To rtfText.Text.Length - 1
            If rtfText.Text.IndexOf(SearchText, i) <> -1 Then
                count.Add(rtfText.Text.IndexOf(SearchText, i))
            ElseIf rtfText.Text.IndexOf(UppercaseFirstLetter(SearchText), i) <> -1 Then
                count.Add(rtfText.Text.IndexOf(UppercaseFirstLetter(SearchText), i))
            End If
        Next
        Try
            For i As Integer = 0 To count.Count - 1
                rtfText.[Select](count(i), SearchText.Length)
                If SelectedBold Then
                    rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Bold)
                ElseIf SelectedItalic Then
                    rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Italic)
                ElseIf SelectedUnderLine Then
                    rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Underline)
                    'ElseIf SelectedBold AndAlso SelectedItalic AndAlso SelectedUnderLine Then
                    '    rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Underline)
                End If
                count.RemoveAt(i)
            Next
            'For i As Integer = 0 To count.Count - 1
            '    rtfText.[Select](count(i), SearchText.Length)
            '    If SelectedBold Then
            '        rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Bold)
            '    ElseIf SelectedItalic Then
            '        rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Italic)
            '    ElseIf SelectedUnderLine Then
            '        rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Underline)
            '    End If
            '    count.RemoveAt(i)
            'Next
        Catch
            count.Reverse()
        End Try
        rtfText.[Select](rtfText.Text.Length, 0)
        rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Regular)
    End If
End Sub

 Private Sub cmbList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbList.SelectedIndexChanged
    rtfText.Text = cmbList.SelectedItem.ToString()
    rtfText.[Select](0, rtfText.Text.Length)
    rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Regular)
    If cmbList.SelectedIndex > -1 Then
        ApplyFormatting("apple")
    End If
End Sub

这是输出:

使用这个方法

Private Sub formatString(ByVal SearchText As String)
    Dim position As Integer = 0
    Dim rtfString As String = LCase(rtfText.Text)
    Dim cnt As Integer = 0
    Dim isStop As Boolean = False
    While Not isStop
        Dim i As Integer = rtfString.IndexOf(SearchText, cnt)
        If i < 0 Then
            isStop = True
        Else
            rtfText.Select(i, SearchText.Length)
            rtfText.SelectionFont = New Font(rtfText.Font, FontStyle.Bold)
            cnt = i + 1
        End If
    End While
    rtfText.Select(position, 0)
End Sub

cmbList_SelectedIndexChanged

If cmbList.SelectedIndex > -1 Then
   'ApplyFormatting("apple")
    formatString("apple")
End If