在RichTextBox中突出显示需要太长时间

时间:2012-05-21 20:46:01

标签: c# winforms richtextbox highlighting

我有一个很大的偏移列表,我需要在我的RichTextBox中突出显示。然而,这个过程耗时太长。我使用以下代码:

foreach (int offset in offsets)
{
    richTextBox.Select(offset, searchString.Length);
    richTextBox.SelectionBackColor = Color.Yellow;
}

有更有效的方法吗?

更新

尝试使用此方法,但它没有突出显示任何内容:

richTextBox.SelectionBackColor = Color.Yellow;
foreach (int offset in offsets)
{
    richTextBox.Select(offset, searchString.Length);
}

3 个答案:

答案 0 :(得分:1)

我用谷歌搜索了你的问题,我发现当有很多行时RichTextBox变得非常慢。
在我看来,你要么购买第三部分控制,你可以通过它的性能来满足你的要求,或者你可以需要线程来分配整个选择任务。我认为他们可以加快进度 希望它有所帮助!

答案 1 :(得分:1)

我之前遇到过同样的问题。我最终忽略了他们给你的所有方法并操纵了底层的RTF数据。此外,你的第二个代码块不起作用的原因是RTF应用格式,所以如果你调用一个函数(在这种情况下是属性)来改变选择颜色,它只会将它应用于当前选择的块。在该电话会议后对选择所做的任何更改都会变得无关紧要。

您可以使用RGB值,或here is a great source如何在RTF控件中执行不同的操作。在您的代码中弹出此功能,看看它的工作情况。我用它来为SQL代码提供实时语法高亮。

    public void HighlightText(int offset, int length)
    {
        String sText = richTextBox.Text.Trim();
        sText = sText.Insert(offset + length - 1, @" \highlight0");
        sText = sText.Insert(offset, @" \highlight1");
        String s = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
            {\colortbl ;\red255\green255\blue0;}\viewkind4\uc1\pard";
        s += sText;
        s += @"\par}";
        richTextBox.Rtf = s;
    }

答案 2 :(得分:0)

如果在循环之外设置SelectionBackColor会有什么不同吗?

查看带有Reflector的RichTextBox显示,每次设置颜色时都会向控件发送一个WindowMessage。在大量偏移的情况下,这可能导致一次又一次突出显示已经突出显示的单词,导致O(n ^ 2)行为。