在C#中删除RichTextBox行,同时保留其余行的颜色

3
考虑一个拥有400行并且包含许多不同颜色单词和行的RichTextBox。
是否有可能删除此文本框中的前100行,同时保留其余单词的颜色?目前,我正在使用以下代码来删除行,但无法保留颜色。
if (rtb.Lines.Count() > 400)
     rtb.Lines = rtb.Lines.Skip(100).ToArray();
3个回答

12

使用 SelectionText 属性。首先选择要删除的行,然后通过将 SelectionText 设置为空字符串来删除它们。像这样:

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

这会保留所有其他行的格式。这可能会导致UI上可见的闪烁,您可以通过像这里所示实现Begin/EndUpdate方法来抑制它。


这很优雅简单,比解析RTF的方式要好得多。赞! - pstrjds
2
只有在richTextBox1.ReadOnly设置为false时,此解决方案才有效。如果不是,则根本不起作用。 - anon

1

如果您想保留格式,就不能使用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

在我的应用程序中,.SelectedText = "" 会导致 Windows 发出提示音。

因此,我找到了第二种解决方案,即使用 .Lines 属性。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接