【问题标题】:RichTextBox, 'Find Previous' functionalityRichTextBox,“查找上一个”功能
【发布时间】:2013-10-14 03:01:48
【问题描述】:

我使用这个通用函数在 RichTextBox 中添加了“FindNext”功能。

#Region " FindNext In RichTextBox "

' [ FindNext In RichTextBox Function ]
'
' //By Elektro H@cker
'
' Examples :
'
' RichTextBox1.Text = "Hello World!, Hello World!, Hello World!"
' FindNext(RichTextBox1, "Hello")

' FindNext
Private Sub FindNext(ByVal [Control] As RichTextBox, _
                     ByVal SearchText As String, _
                     Optional ByVal Highlight_BackColor As Color = Nothing, _
                     Optional ByVal Highlight_ForeColor As Color = Nothing)

    ' Start searching at 'SelectionStart'.
    Dim Search_StartIndex As Integer = [Control].SelectionStart
    Static Next_Count As Integer = 0

    ' Restore Highlight colors of previous selection
    [Control].SelectionBackColor = [Control].BackColor
    [Control].SelectionColor = [Control].ForeColor

    ' Set next selection Highlight colors
    If Highlight_BackColor = Nothing Then Highlight_BackColor = [Control].BackColor
    If Highlight_ForeColor = Nothing Then Highlight_ForeColor = [Control].ForeColor

    ' If is not first FindNext call then...
    If Next_Count <> 0 Then
        Search_StartIndex += SearchText.Length
    Else ' If is first FindNext call then...
        Next_Count += 1
    End If

    ' Set Search_StartIndex
    Search_StartIndex = _
    [Control].Find(SearchText, Search_StartIndex, RichTextBoxFinds.NoHighlight Or RichTextBoxFinds.None)
    ' ...And prevent search at End Of File
    If Search_StartIndex = -1 Then
        Search_StartIndex = _
        [Control].Find(SearchText, 0, RichTextBoxFinds.NoHighlight Or RichTextBoxFinds.None)
    End If

    ' Set the match selection
    [Control].Select(Search_StartIndex, SearchText.Length)
    ' Set the BackColor
    [Control].SelectionBackColor = Highlight_BackColor
    ' Set the ForeColor
    [Control].SelectionColor = Highlight_ForeColor
    ' Scroll to Caret/Cursor position
    [Control].ScrollToCaret()

End Sub

#End Region

如何编写“查找上一个”功能?

我想我可以使用 RegEx MatchCollection 通过移动集合的当前 RegEx 匹配索引来轻松添加“查找下一个”或“查找上一个”,但是 regex 很慢,我还有其他使用简单字符串搜索的替代方法吗?

【问题讨论】:

    标签: .net vb.net string winforms richtextbox


    【解决方案1】:

    我终于可以自己完成了,是的,它使用了正则表达式:

    http://www.youtube.com/watch?v=mWRMdlC5DH8

    #Region " [RichTextBox] FindNext "
    
        ' [ FindNext ]
        '
        ' //By Elektro H@cker
        '
        ' Examples :
        '
        ' RichTextBox1.Text = "Hello World!, Hello World!, Hello World!"
        '
        ' FindNext(RichTextBox1, "hello", FindDirection.Down, RegexOptions.IgnoreCase, Color.LightBlue, Color.Black)
        ' FindNext(RichTextBox1, "hello", FindDirection.Up, RegexOptions.IgnoreCase, Color.Red, Color.Black)
        '
        ' Private Sub RichTextBox_Enter(sender As Object, e As EventArgs) ' Handles RichTextBox1.Enter
        '    ' Restore Selection Colors before search next match.
        '    sender.SelectionBackColor = DefaultBackColor
        '    sender.SelectionColor = DefaultForeColor
        ' End Sub
    
        Public Enum FindDirection As Short
            Up = 0
            Down = 1
        End Enum
    
        ' FindNext
        Private Sub FindNext(ByVal [Control] As RichTextBox, _
                                   ByVal SearchText As String, _
                                   ByVal Direction As FindDirection, _
                                   Optional ByVal IgnoreCase As System.Text.RegularExpressions.RegexOptions = RegexOptions.None, _
                                   Optional ByVal Highlight_BackColor As Color = Nothing, _
                                   Optional ByVal Highlight_ForeColor As Color = Nothing)
    
            If [Control].TextLength = 0 Then Exit Sub
    
            ' Start searching at 'SelectionStart'.
            Dim Search_StartIndex As Integer = [Control].SelectionStart
    
            ' Stores the MatchIndex count
            Dim matchIndex As Integer = 0
    
            ' Flag to check if it's first find call
            Static First_Find As Boolean = True
    
            ' Checks to don't ommit the selection of first match if match index is exactly at 0 start point.
            If First_Find _
                AndAlso Search_StartIndex = 0 _
                AndAlso Direction = FindDirection.Down Then
                Search_StartIndex = -1
                First_Find = False
            ElseIf Not First_Find _
                AndAlso Search_StartIndex = 0 _
                AndAlso Direction = FindDirection.Down Then
                First_Find = False
                Search_StartIndex = 0
            End If
    
            ' Store the matches
            Dim matches As System.Text.RegularExpressions.MatchCollection = _
                System.Text.RegularExpressions.Regex.Matches([Control].Text, _
                                                             SearchText, _
                                                             IgnoreCase Or If(Direction = FindDirection.Up, _
                                                                              RegexOptions.RightToLeft, _
                                                                              RegexOptions.None))
    
            If matches.Count = 0 Then First_Find = True : Exit Sub
    
            ' Restore Highlight colors of previous selection
            [Control].SelectionBackColor = [Control].BackColor
            [Control].SelectionColor = [Control].ForeColor
    
            ' Set next selection Highlight colors
            If Highlight_BackColor = Nothing Then Highlight_BackColor = [Control].BackColor
            If Highlight_ForeColor = Nothing Then Highlight_ForeColor = [Control].ForeColor
    
            ' Set the match selection
            For Each match As System.Text.RegularExpressions.Match In matches
    
                matchIndex += 1
    
                Select Case Direction
    
                    Case FindDirection.Down
                        If match.Index > Search_StartIndex Then ' Select next match
                            [Control].Select(match.Index, match.Length)
                            Exit For
                        ElseIf match.Index <= Search_StartIndex _
                        AndAlso matchIndex = matches.Count Then ' Select first match
                            [Control].Select(matches.Item(0).Index, matches.Item(0).Length)
                            Exit For
                        End If
    
                    Case FindDirection.Up
                        If match.Index < Search_StartIndex Then ' Select previous match
                            [Control].Select(match.Index, match.Length)
                            Exit For
                        ElseIf match.Index >= Search_StartIndex _
                        AndAlso matchIndex = matches.Count Then ' Select last match
                            [Control].Select(matches.Item(0).Index, matches.Item(0).Length)
                            Exit For
                        End If
    
                End Select
    
            Next match
    
            ' Set the current selection BackColor
            [Control].SelectionBackColor = Highlight_BackColor
            ' Set the current selection ForeColor
            [Control].SelectionColor = Highlight_ForeColor
            ' Scroll to Caret/Cursor selection position
            [Control].ScrollToCaret()
    
        End Sub
    
    #End Region
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多