Я создал класс файла модуля журнала и в этом классе я расширил его и добавил свой собственный StringBuilder, и я хочу иметь возможность легко раскрашивать линии в элементе управления richTextBox1 в дизайнере form1 в зависимости от настройка цвета в классе Logger для каждой строки StringBuilder.
В классе Logger я расширил класс, включив в него свой собственный StringBuilder со свойством цвета.
// Logger.cs использование системы; использование System.Collections.Generic; использование System.Drawing; использование System.Text; использование System.Windows.Forms; пространство имен Logger_Testing { Регистратор публичного класса { частный RichTextBox richTextBoxLogger; частный CustomStringBuilder sb = новый CustomStringBuilder(); общедоступный регистратор (RichTextBox richTextBoxLogger) { this.richTextBoxLogger = richTextBoxLogger; } public void LogStartDownload (строка fileName, строка fileUrl) { sb.AppendLine($"[Время начала]: {DateTime.Now}", Color.Yellow); sb.AppendLine($"[Имя файла]: {fileName}", Color.Yellow); sb.AppendLine($"[URL-адрес файла]: {fileUrl}", Color.Yellow); sb.AppendLine($"[Status] Идет загрузка", Color.Yellow); } public void LogDownloadProgress (двойной процент, двойная скорость, длинный totalBytes, длинный contentLength, TimeSpan elapsedTime) { this.elapsedTime = elapsedTime; // Сохраняем прошедшее время для дальнейшего использования sb.AppendLine($"[Прогресс]: {percentage}%", Color.Yellow); sb.AppendLine($"[Downloaded]: {FormatBytes(totalBytes)} / {FormatBytes(contentLength)}", Color.Yellow); sb.AppendLine($"[Скорость загрузки]: {FormatBytes(speed)}/s", Color.Yellow); sb.AppendLine($"[Прошедшее время]: {FormatTimeSpan(elapsedTime)}", Color.Yellow); } public void LogDownloadCompleted (bool isSuccess, TimeSpan elapsedTime, bool isCancelled) { this.elapsedTime = elapsedTime; // Обновляем прошедшее время после завершения загрузки если (!isCancelled) { sb.Replace($"[Status] Идет загрузка", $"[Status]: Download {(isSuccess ? "Завершено успешно": "Ошибка")}", Color.Yellow); } еще { sb.Replace($"[Status] Идет загрузка", $"[Status]: Загрузка отменена", Color.Red); } sb.AppendLine($"[Прошедшее время]: {FormatTimeSpan(elapsedTime)}", Color.Yellow); sb.AppendLine($"[Время окончания]: {DateTime.Now}", Color.Yellow); sb.AppendLine("", Color.Yellow); // Добавляем пробел между журналами загрузок } общественная недействительность LogDownloadCompleted() { sb.AppendLine("[Состояние]: Все загрузки завершены", Color.Yellow); sb.AppendLine("", Color.Yellow); } общественная недействительность LogDownloadCancelled() { sb.AppendLine("[Состояние]: Операция отменена, все файлы удалены", Color.Yellow); sb.AppendLine("", Color.Yellow); } общедоступная строка GetLog (RichTextBox richTextBoxLogger) { richTextBoxLogger.Очистить(); строка журнала = sb.ToString(); richTextBoxLogger.AppendText(журнал); // Установите текст RichTextBox в формате RTF, чтобы сохранить форматирование //logBuilder.Clear(); // Очистка журнала после его однократного добавления журнал возврата; } частная строка FormatBytes (двойные байты) { константный масштаб = 1024; string[] unit = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; если (байты = 0 && индекс l.Text.Contains(oldText)); если (строка != ноль) { line.Text = line.Text.Replace(oldText, newText); линия.Цвет = цвет текста; } } общедоступная строка переопределения ToString() { Результат StringBuilder = новый StringBuilder(); foreach (строка var в строках) { результат.AppendLine(line.Text); } вернуть результат.ToString(); } } общедоступный класс CustomStringBuilderItem { публичная строка Text {get; набор; } общественный Цвет Цвет { get; набор; } } } } Например, я хочу, чтобы эта строка была окрашена в красный цвет в richTextBox1, который у меня есть в дизайнере form1:
sb.Replace($"[Status] Идет загрузка", $"[Status]: Загрузка отменена", Color.Red); Вот как я использую это в form1
с использованием системы; использование System.Collections.Generic; использование System.ComponentModel; использование System.Data; использование System.Drawing; используя System.Linq; использование System.Text; использование System.Threading.Tasks; использование System.Windows.Forms; пространство имен Logger_Testing { публичный частичный класс Form1: Форма { Регистратор-регистратор; частный TimeSpan _elapsedTime; общедоступная форма1() { ИнициализироватьКомпонент(); logger = новый Logger (richTextBox1); logger.LogStartDownload("Привет", "Привет, мир"); logger.GetLog(richTextBox1); } Private void btnReplace_Click (отправитель объекта, EventArgs e) { logger.LogDownloadCompleted(false, _elapsedTime, true); logger.LogDownloadCancelled(); logger.GetLog(richTextBox1); } } } Но в результате, когда я нажимаю кнопку, чтобы заменить текст, замененный текст также отображается желтым цветом, как и весь остальной текст в richTextBox1, а не красным для конкретной строки замены.
Строка «[Состояние]: Загрузка отменена» должна быть окрашена в красный цвет.
