int02h
@int02h

Сброс форматирования в RichTextBox (WinForms)

Обращаюсь к тебе, уважаемое хабрасообщество со своим, возможно, ламерским вопросом. На форме есть RichTextBox, который называется richInputChains. Стоит задача раскрасить каждую его строчку в красный или зеленый цвет в зависимости от результатов некой проверки. Я делаю это так:
foreach(string line in richInputChains.Lines)
{
	bool accepted = SomeCheck(line);
	richInputChains.SelectionStart = pos;
	richInputChains.SelectionLength = line.Length;
	richInputChains.SelectionBackColor = (accepted) ? Color.Green : Color.Red;
	pos += line.Length + 1;
}

Все прекрасно работает. Но вот я никак не могу понять, как теперь сбросить всю эту раскраску. Делаю это в обработчики события TextChange для richInputChains:
private void richInputChains_TextChanged(object sender, EventArgs e)
{
	richInputChains.SelectionBackColor = System.Drawing.SystemColors.Window;
}

Однако, когда я начинаю менять текст, старая раскраска остается. Что делать? В чем я не прав?

Метод типа:
richInputChains.SelectAll();
richInputChains.SelectionBackColor = System.Drawing.SystemColors.Window;
richInputChains.DeselectAll();

и подобные ему неудачны, так как они не дают спокойно вводить новый текст (ведь действо происходит в обработчике измененения текста), ведь пользователь кликнул в определенную позицию в тексте, а после указанных преобразование каретка переноситься на начало текста.
  • Вопрос задан
  • 4528 просмотров
Решения вопроса 1
Dzuba
@Dzuba
Встречный вопрос: а почему бы не запоминать позицию каретки, а точнее — выделение (SelectionStart, SelectionLength) перед SelectAll() и не восстанавливать это дело вместо DeselectAll()?

При этом, чтобы не было лишних срабатываний события TextChanged, возможно имеет смысл ввести соответствующую бульку. На всякий случай.
Просто я не использую RichTextBox и поэтому не уверен, будет ли снова вызываться событие TextChanged, когда мы меняем расцветку текста в обработчике события TextChanged.

Получится так:
private bool isTextChangedHandlerRunning;

private void richInputChains_TextChanged(object sender, EventArgs e)
{
	if (isTextChangedHandlerRunning)
		return;

	isTextChangedHandlerRunning = true;
	int saveStart = richInputChains.SelectionStart;
	int saveLength = richInputChains.SelectionLength;

	richInputChains.SelectAll();
	richInputChains.SelectionBackColor = System.Drawing.SystemColors.Window;
	
	richInputChains.SelectionStart = saveStart;
	richInputChains.SelectionLength = saveLength;
	isTextChangedHandlerRunning = false;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы