【问题标题】:Highlight text in a richtextbox in windows forms在 Windows 窗体中突出显示富文本框中的文本
【发布时间】:2013-01-05 04:03:48
【问题描述】:

当我输入RichTextBox 时,如何使某个单词突出显示?

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

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

如果我打开我的程序并输入“hello,你好吗?”你好这个词变成了粗体......有什么想法吗? (我的想法是制作一个带有语法高亮的文本编辑器,不能指定单词)

(对不起,如果还有其他类似的问题,我尝试搜索但没有找到对我有帮助的答案)

它的窗体,visual basic

【问题讨论】:

    标签: vb.net winforms fonts richtextbox syntax-highlighting


    【解决方案1】:

    这段代码应该可以完成工作:

    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
    

    为每个索引选择文本并将其设为粗体。

    现在将此代码添加到TextChanged-Event 中,以随时检查您的单词的文本是否发生更改。

    【讨论】:

    • +1 但他要求 vb,当单词改变时,它会将光标带到单词的开头。不过很好。
    【解决方案2】:

    我以不同的方式得到它:

       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
    

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

    【讨论】:

    • 你确定这样可以吗?我测试了,没有用。我编辑了你的代码。您不能将string 添加到int。还是不错的,所以+1
    • @JanesAbouChleih ye 它的工作正常,我不知道为什么不适合你,我不确定你说它卡在哪里:S
    • 查看修订版,您就会明白我所说的stringint 是什么意思。链接:stackoverflow.com/posts/14470919/revisions 但我会向您解释:RichTextBox1.Text.IndexOf("test""hello", asdstartIndex).ToString() + "test""hello".Length 首先.ToString() 是一个方法,尽管在这种情况下它不接受参数,但您需要括号。然后您尝试将IndexOf("test""hello", asdstartIndex).ToString()"hello".Length 相加。这不行:一个是string,另一个是int
    • @JanesAbouChleih 嗯,看起来你是对的,但奇怪的是,即使使用 .ToString(),这段代码也适用于我,但我想当 .ToString() 返回一个数字时,它的总和会一样吗?
    【解决方案3】:

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

        '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
    

    我希望代码会有所帮助。

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

        【解决方案5】:

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

            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
        

        【讨论】:

          猜你喜欢
          • 2013-01-10
          • 2014-02-09
          • 2013-01-23
          • 1970-01-01
          • 2011-05-21
          • 2012-06-26
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          相关资源
          最近更新 更多