RichTextBox удалить цвет из удаленных «ключевых слов» - PullRequest
0 голосов
/ 08 мая 2018

Недавно я нашел этот интересный код, который меняет цвет «ключевых слов» в элементе управления RichTextBox, по этой ссылке Цвета определенных слов в RichtextBox

Проблема в том, что при удалении некоторых букв слова слово остается цветным.

например. Ключевое слово - AND, и оно красное, но если я удалю букву N, оставшиеся буквы AD по-прежнему красные.

Я хочу установить его обратно на RichTextBox ForeColor.

Я знаю, что мне, вероятно, следует установить ForeColor обратно в белый цвет (мой цвет по умолчанию) перед проверкой ключевых слов, но все, что я пробовал, работает.

Есть идеи?

Код Sajeetharan

private void Rchtxt_TextChanged(object sender, EventArgs e)
    {
        this.CheckKeyword("and", Color.Red, 0);
        this.CheckKeyword("or", Color.Red, 0);
    }

private void CheckKeyword(string word, Color color, int startIndex)
{
    if (this.Rchtxt.Text.Contains(word))
    {
        int index = -1;
        int selectStart = this.Rchtxt.SelectionStart;

        while ((index = this.Rchtxt.Text.IndexOf(word, (index + 1))) != -1)
        {
            this.Rchtxt.Select((index + startIndex), word.Length);
            this.Rchtxt.SelectionColor = color;
            this.Rchtxt.Select(selectStart, 0);
            this.Rchtxt.SelectionColor = Color.Black;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Используйте этот ответ как ссылку для результатов:
Как раскрасить разные слова разными цветами в RichTextBox

Этот объект класса используется для отслеживания слов, которые нужно раскрасить, и связанного с ними цвета, используемого при написании или изменении одного из следующих слов:
(Связанный ответ объясняет, как заполнить список словами и связанными цветами)

public class ColoredWord
{
    public string Word { get; set; }
    public Color WordColor { get; set; }
}

public List<ColoredWord> ColoredWords = new List<ColoredWord>();

В событии RichTextBox KeyUp() проверьте, вставляется или изменяется слово в списке:
Здесь я использую событие KeyUp(), потому что на данный момент оно уже вставлено / изменено.

private void richTextBox1_KeyUp(object sender, KeyEventArgs e)
{
    if ((e.KeyCode >= Keys.Left & e.KeyCode <= Keys.Down)) return;
    if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.Alt || e.KeyCode == Keys.ControlKey) return;

    int CurrentPosition = richTextBox1.SelectionStart;
    int[] WordStartEnd;

    string word = GetWordFromPosition(richTextBox1, CurrentPosition - 1, out WordStartEnd);
    ColoredWord result = ColoredWords.FirstOrDefault(s => s.Word == word.ToUpper());
    SetSelectionColor(richTextBox1, result, CurrentPosition, WordStartEnd);

    if (e.KeyCode == Keys.Space && result == null) 
    {
        word = GetWordFromPosition(richTextBox1, CurrentPosition + 1, out WordStartEnd);
        result = ColoredWords.FirstOrDefault(s => s.Word == word.ToUpper());
        SetSelectionColor(richTextBox1, result, CurrentPosition, WordStartEnd);
    }
}

Это вспомогательные методы, которые используются для окраски слова, когда оно включено в список, и для извлечения слова из текущей позиции каретки.

Случай, когда уже окрашенное слово разделяется пробелом, таким образом оба конца теряют их цвет, обрабатывается в событии KeyUp() (часть кода: if (e.KeyCode == Keys.Space && result == null).

private void SetSelectionColor(RichTextBox ctl, ColoredWord word, int Position, int[] WordStartEnd)
{
    ctl.Select(WordStartEnd[0], WordStartEnd[1]);
    if (word != null)
    {
        if (ctl.SelectionColor != word.WordColor)
            ctl.SelectionColor = word.WordColor;
    }
    else
    {
        if (ctl.SelectionColor != ctl.ForeColor)
            ctl.SelectionColor = ctl.ForeColor;
    }
    ctl.SelectionStart = Position;
    ctl.SelectionLength = 0;
    ctl.SelectionColor = richTextBox1.ForeColor;
}

private string GetWordFromPosition(RichTextBox ctl, int Position, out int[] WordStartEnd)
{
    int[] StartEnd = new int[2];
    StartEnd[0] = ctl.Text.LastIndexOf((char)Keys.Space, Position - 1) + 1;
    StartEnd[1] = ctl.Text.IndexOf((char)Keys.Space, Position);
    if (StartEnd[1] == -1) StartEnd[1] = ctl.Text.Length;
    StartEnd[1] -= StartEnd[0];
    WordStartEnd = StartEnd;
    return ctl.Text.Substring(StartEnd[0], StartEnd[1]);
}
0 голосов
/ 08 мая 2018

Можно сбросить цвет всего текста до цвета по умолчанию (в данном случае черного), а затем запустить обычную раскраску ключевых слов, чтобы снова применить цвета.

    private void Rchtxt_TextChanged(object sender, EventArgs e)
    {
        this.CheckKeyword(Rchtxt.Text, Color.Black, 0);
        this.CheckKeyword("and", Color.Red, 0);
        this.CheckKeyword("or", Color.Red, 0);
    }
...