Selectively coloring text in RichTextBox

后端 未结 4 1806
深忆病人
深忆病人 2020-11-28 14:50

How can I paint in red every time I meet the letter \"A\" in RichTextBox?

相关标签:
4条回答
  • 2020-11-28 15:12

    Here is a snippet out of my wrapper class to do this job:

        private delegate void AddMessageCallback(string message, Color color);
    
        public void AddMessage(string message)
        {
            Color color = Color.Empty;
    
            string searchedString = message.ToLowerInvariant();
    
            if (searchedString.Contains("failed")
                || searchedString.Contains("error")
                || searchedString.Contains("warning"))
            {
                color = Color.Red;
            }
            else if (searchedString.Contains("success"))
            {
                color = Color.Green;
            }
    
            AddMessage(message, color);
        }
    
        public void AddMessage(string message, Color color)
        {
            if (_richTextBox.InvokeRequired)
            {
                AddMessageCallback cb = new AddMessageCallback(AddMessageInternal);
                _richTextBox.BeginInvoke(cb, message, color);
            }
            else
            {
                AddMessageInternal(message, color);
            }
        }
    
        private void AddMessageInternal(string message, Color color)
        {
            string formattedMessage = String.Format("{0:G}   {1}{2}", DateTime.Now, message, Environment.NewLine);
    
            if (color != Color.Empty)
            {
                _richTextBox.SelectionColor = color;
            }
            _richTextBox.SelectedText = formattedMessage;
    
            _richTextBox.SelectionStart = _richTextBox.Text.Length;
            _richTextBox.ScrollToCaret();
        }
    

    Now you can call it with AddMessage("The command failed") to get it automatically highlight in red. Or you can call it with AddMessage("Just a special message", Color.Purple) to define a special color (Helpful e.g. within catch blocks to define a specific color, regardless of the message content)

    0 讨论(0)
  • 2020-11-28 15:16

    This won't work while you are typing if that is what you are looking for, but I use this to highlight substrings:

    Function Highlight(ByVal Search_Str As Object, ByVal InputTxt As String, ByVal StartTag As String, ByVal EndTag As String) As String
        Highlight = Regex.Replace(InputTxt, "(" & Regex.Escape(Search_Str) & ")", StartTag & "$1" & EndTag, RegexOptions.IgnoreCase)
    End Function
    

    and call it this way:

    Highlight("A", "Color All my A's red", [span class=highlight]', '[/span]')
    

    Where the class 'highlight' has whatever color coding/formatting you want:

    .highlight {text-decoration: none;color:black;background:red;}
    

    BTW: you need to change those square brackets to angled ones...they wouldn't come thru when I typed them...

    0 讨论(0)
  • 2020-11-28 15:22

    This is the C# code for EJ Brennan's answer:

    public string Highlight(object Search_Str, string InputTxt, string StartTag, string EndTag) 
    {
        return Regex.Replace(InputTxt, "(" + Regex.Escape(Search_Str) + ")", StartTag + "$1" + EndTag, RegexOptions.IgnoreCase);
    }
    
    0 讨论(0)
  • 2020-11-28 15:26

    Try this:

    static void HighlightPhrase(RichTextBox box, string phrase, Color color) {
      int pos = box.SelectionStart;
      string s = box.Text;
      for (int ix = 0; ; ) {
        int jx = s.IndexOf(phrase, ix, StringComparison.CurrentCultureIgnoreCase);
        if (jx < 0) break;
        box.SelectionStart = jx;
        box.SelectionLength = phrase.Length;
        box.SelectionColor = color;
        ix = jx + 1;
      }
      box.SelectionStart = pos;
      box.SelectionLength = 0;
    }
    

    ...

    private void button1_Click(object sender, EventArgs e) {
      richTextBox1.Text = "Aardvarks are strange animals";
      HighlightPhrase(richTextBox1, "a", Color.Red);
    }
    
    0 讨论(0)
提交回复
热议问题