удаление строк RichTextBox с сохранением цвета оставшихся строк в C # - PullRequest
3 голосов
/ 01 сентября 2011

Рассмотрим RichTextBox, который имеет 400 строк и содержит несколько слов и строк с нечеткими цветами.

Возможно ли удалить первые 100 строк этого текстового поля, в то время как цвет оставшихся слов зарезервирован,В настоящее время я использую приведенный ниже код для удаления строк, но он не может сохранять цвета.

if (rtb.Lines.Count() > 400)
     rtb.Lines = rtb.Lines.Skip(100).ToArray();

Ответы [ 3 ]

11 голосов
/ 01 сентября 2011

Используйте свойство SelectionText.Сначала выберите строки, которые вы хотите удалить, затем удалите их, установив SelectionText в пустую строку.Например:

   richTextBox1.SelectionStart = 0;
   richTextBox1.SelectionLength = richTextBox1.GetFirstCharIndexFromLine(200);
   richTextBox1.SelectedText = "";

Это сохраняет форматирование всех остальных строк.Это может вызвать видимое мерцание в пользовательском интерфейсе, вы можете подавить это, реализовав методы Begin / EndUpdate как , показанное здесь .

1 голос
/ 01 сентября 2011

Вы не можете использовать свойство Lines, если хотите сохранить форматирование.Lines является производным от TextBoxBase.Вам нужно использовать свойство Rtf и самостоятельно разобрать строки в возвращаемой строке.Если вы хотите просто получить счетчик строк и затем проанализировать RTF, то вы можете сделать что-то вроде:

// NOTE: I am using Length rather than Count() because the array already knows its length
if (rtb.Lines.Length > 400)
{
    // Parse the rtf here to remove the unwanted lines and preserve the format
}

Вам нужно будет посмотреть спецификацию RTF , чтобы точно вытащитьфактические линии.Разрыв строки обозначается тегом \par.Строка, с которой было бы сложно разобраться, является первой строкой, поскольку она может содержать дополнительную информацию перед фактическим текстом первой строки.

0 голосов
/ 04 сентября 2012

.SelectedText = "" создает дин Windows в моем приложении

Итак, я нашел второе решение, которое заключается в игре со свойством .Lines

if (nbLines > maxLines)
{
    Array.Copy(rtfBox.Lines, 1,
               rtfBox.Lines, 0, rtfBox.Lines.Length - 1);
}
...