vb.net 在 Windows 窗体中突出显示富文本框中的文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14449847/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 11:58:25  来源:igfitidea点击:

Highlight text in a richtextbox in windows forms

vb.netwinformsfontsrichtextboxsyntax-highlighting

提问by jAC

How to make when i type in a RichTextBoxa certain word it gets highlited?

当我输入RichTextBox某个单词时,如何使其高亮显示?

how do i find words in the text to use SelectionColoror SelectionFont

我如何在文本中找到要使用的单词SelectionColorSelectionFont

For example: i want that all times that the word "hello" appear in the RichTextBoxit turn to boldor turn into a color...

例如:我希望“你好”这个词出现在RichTextBox它的所有时间都变成粗体或变成一种颜色......

Then if i open my program and type "hello, how are you?" the word hello turns into bold... any idea? (my idea is to make a text editor with syntax highlight that ill specify the words)

然后,如果我打开我的程序并输入“你好,你好吗?” 你好这个词变成了粗体……有什么想法吗?(我的想法是制作一个带有语法突出显示的文本编辑器,可以指定单词)

(sorry if there is another question like that, i tried to search but i didn't find a answer that helped me)

(抱歉,如果还有这样的问题,我尝试搜索,但没有找到对我有帮助的答案)

its windows forms, visual basic

它的窗口形式,visual basic

回答by jAC

This code should do the work:

这段代码应该做的工作:

Dim searchstring As String = "hello"
' The word you're looking for
Dim count As New List(Of Integer)()
For i As Integer = 0 To richTextBox1.Text.Length - 1
    If richTextBox1.Text.IndexOf(searchstring, i) <> -1 Then
        'If the word is found
            'Add the index to the list
        count.Add(richTextBox1.Text.IndexOf(searchstring, i))
    End If
Next
Try
    For i As Integer = 0 To count.Count - 1

        richTextBox1.[Select](count(i), searchstring.Length)
        richTextBox1.SelectionFont = New Font(richTextBox1.Font, FontStyle.Bold)
        count.RemoveAt(i)
    Next
Catch
End Try
richTextBox1.[Select](richTextBox1.Text.Length, 0)
richTextBox1.SelectionFont = New Font(richTextBox1.Font, FontStyle.Regula

For each index select the text and make it bold.

对于每个索引,选择文本并使其加粗。

Now add this code to the TextChanged-Event to check any time the text changed for your word.

现在将此代码添加到TextChanged-Event 以检查文本是否因您的单词而更改。

回答by jAC

I got it in a different way:

我以不同的方式得到它:

   While Not RichTextBox1.Text.IndexOf("hello", startIndex) = -1
               selectedIndex= RichTextBox1.SelectionStart
        Try
                RichTextBox1.Select(RichTextBox1.Text.IndexOf("test", startIndex) - 1, 1)
        Catch
        End Try
        If RichTextBox1.SelectedText = " " Or RichTextBox1.SelectedText = Nothing Then
            RichTextBox1.Select(RichTextBox1.Text.IndexOf("hello", startIndex) + "test".Length, 1)
            If RichTextBox1.SelectedText = " " Or RichTextBox1.SelectedText = Nothing Then
                RichTextBox1.Select(RichTextBox1.Text.IndexOf("hello", startIndex), "test".Length)
                RichTextBox1.SelectionColor = Color.Blue
            End If
        End If

        startIndex = RichTextBox1.Text.IndexOf("hello", startIndex) + "hello".Length
        RichTextBox1.SelectionStart = selectedIndex
        RichTextBox1.SelectionLength = 0
        RichTextBox1.SelectionColor = Color.Black
    End While

I don't know if it is the best way, but works.

我不知道这是否是最好的方法,但有效。

回答by Benjli

That is a code for highlighting selected text at yellow (can be replaced by any other color), after finding it:

这是一个代码,用于在黄色(可以用任何其他颜色替换)中突出显示选定的文本,找到后:

    'find the text that need to be highlighted.
    foundIndex = RichTextBox1.Find("hello", foundIndex + 1, -1, selectedFinds)
    RichTextBox1.Focus()

    If foundIndex = -1 Then
        MessageBox.Show("This document don't contains the text you typed, or any of the text you typed as a whole word or mach case.", "Find Text Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
 else
'now the text will be highlighted.
 RichTextBox1.SelectionBackColor = Color.Yellow
Richtextbox1.focus
    End If

I hope that code will help.

我希望该代码会有所帮助。

回答by kb.baby

Private Sub RichTextBox1_DragOver(sender As Object, e As DragEventArgs) Handles RichTextBox1.DragOver

Private Sub RichTextBox1_DragOver(sender As Object, e As DragEventArgs) 处理 RichTextBox1.DragOver

    Dim p As Point
    p.X = e.X
    p.Y = e.Y
    Dim num As Integer
    Dim rightTXT As String
    Dim leftTXT As String
    Dim textpart As String
    Dim TSelect As Boolean
    Dim curpos As Integer = RichTextBox1.GetCharIndexFromPosition(RichTextBox1.PointToClient(p))
    Dim PosStart As Integer

    TSelect = False
    If e.Data.GetDataPresent(DataFormats.StringFormat) Then

        e.Effect = DragDropEffects.All

        Try
            leftTXT = Microsoft.VisualBasic.Left(RichTextBox1.Text, curpos)
            If InStr(leftTXT, "%", CompareMethod.Text) Then
                rightTXT = Microsoft.VisualBasic.Right(RichTextBox1.Text, Len(RichTextBox1.Text) - curpos)

                If InStr(rightTXT, "%", CompareMethod.Text) Then
                    PosStart = curpos - InStr(StrReverse(leftTXT), "%") + 1
                    num = curpos + InStr(rightTXT, "%") - PosStart - 1

                    textpart = (RichTextBox1.Text.Substring(PosStart, num).TrimEnd)

                    Label3.Text = "mouse drag over:" + textpart
                    Label5.Text = num.ToString()

                    If ListBox1.Items.Contains(textpart) Then
                        TSelect = True
                    End If
                End If
            End If
        Catch ex As Exception
            Label4.Text = ex.ToString()
        End Try

    End If

    If TSelect Then      
        Me.RichTextBox1.Select(PosStart - 1, num + 2)
        wordSearch = RichTextBox1.SelectedText

        Label4.Text = "word drag state: true"
        match = True   
    Else
        Label3.Text = "mouse drag over:"
        Label4.Text = "word drag state: false"
        Me.RichTextBox1.Select(0, 0)
    End If
End Sub

回答by Hannington Mambo

I find the above codes to be too lengthy/complicated for a simple task...

我发现上面的代码对于一个简单的任务来说太长/太复杂了......

    Dim c As Integer = 0

    Dim o As Integer = 0
    Dim s As Integer = 0

    Dim txt As String = RTB.Text
    RTB.BackColor = Color.Black

    Dim starts As Integer = 0

    Do While txt.Contains(key) ' this avoids unnecessary loops

        s = txt.IndexOf(key)
        starts = s + o
        RTB.Select(starts, key.Length)
        RTB.SelectionBackColor = Color.Yellow
        RTB.SelectionColor = Color.Blue

        txt = txt.Substring(s + key.Length)
        o += (s + key.Length)

        c += 1

    Loop
    Me.Status.Text = c.ToString() & " found" ' and the number found