Выборочная окраска текста в RichTextBox - PullRequest
7 голосов
/ 18 января 2009

Как я могу рисовать красным каждый раз, когда встречаю букву "А" в RichTextBox?

Ответы [ 4 ]

26 голосов
/ 18 января 2009

Попробуйте это:

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);
}
2 голосов
/ 27 ноября 2009

Вот фрагмент из моего класса-обертки, чтобы сделать эту работу:

    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();
    }

Теперь вы можете вызвать его с помощью AddMessage("The command failed"), чтобы автоматически выделить его красным цветом. Или вы можете вызвать его с помощью AddMessage("Just a special message", Color.Purple), чтобы определить специальный цвет (полезно, например, в блоках перехвата, чтобы определить определенный цвет, независимо от содержимого сообщения)

1 голос
/ 18 января 2009

Это код C # для ответа Э.Дж. Бреннана:

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);
}
1 голос
/ 18 января 2009

Это не будет работать, пока вы печатаете, если это то, что вы ищете, но я использую это для выделения подстрок:

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

и назовите это так:

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

Где у класса 'highlight' есть желаемое цветовое кодирование / форматирование:

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

Кстати: вам нужно поменять квадратные скобки на угловые ... они не появятся, когда я их наберу ...

...