更快地为C#中的RichTextBox中的所有事件着色

时间:2010-10-03 09:37:38

标签: c# richtextbox text-coloring

我有一个RichTextBox,并且指定搜索字符串的出现次数超过1000次。

我使用以下函数为所有事件着色:

public void ColorAll(string s)
{
    rtbxContent.BeginUpdate();

    int start = 0, current = 0;
    RichTextBoxFinds options = RichTextBoxFinds.MatchCase;
    start = rtbxContent.Find(s, start, options);
    while (start >= 0)
    {
        rtbxContent.SelectionStart  = start;
        rtbxContent.SelectionLength = s.Length;
        rtbxContent.SelectionColor     = Color.Red;
        rtbxContent.SelectionBackColor = Color.Yellow;

        current = start + s.Length;
        if (current < rtbxContent.TextLength)
            start = rtbxContent.Find(s, current, options);
        else
            break;
    }

    rtbxContent.EndUpdate();
}

但我发现它很慢。

但是,如果我为同一文本中出现次数较少的另一个单词的所有出现着色,我发现它非常快。

所以我认为缓慢来自(这两行可能涉及UI刷新):

    rtbxContent.SelectionColor     = Color.Red;
    rtbxContent.SelectionBackColor = Color.Yellow;

是否有更快的方法来完成相同的工作,例如,我在内存中进行着色,然后我一次性显示结果?

我能说清楚吗?

感谢。

3 个答案:

答案 0 :(得分:1)

所花费的时间与出现的次数成正比。

可能是Find正在使用最多的时间。你可以替换这一行:

    start = rtbxContent.Find(s, start + s.Length, options); 

用这个:

    start = rtbxContent.Find(s, current, options);

因为你已计算出等于start + s.Length的电流

您还可以存储s.Length是一个变量,因此您不需要每次都计算字符串中的所有字符。 rtbxContent.TextLength也是如此。

答案 1 :(得分:0)

字符串搜索是线性的。如果您发现Find方法速度较慢,也许您可​​以使用第三方工具进行搜索。您所需要的只是字符串中模式的索引。

也许this will help you。你应该把差异计算在一起并使用更快的差异。

答案 2 :(得分:0)

你正走在正确的轨道上,Winforms的慢速RichTextBox实现应该受到责备。您还可以使用BeginUpdate和EndUpdate方法(我猜你从here获取了那些?)。但唉,这还不够。

一些解决方案:

1:尝试将RTF直接写入文本框。这是一个相当混乱,复杂的格式,但幸运的是,我已经创建了一个答案here,可以解决这个问题。

2:这个评价很高的外部项目看起来也值得一看:http://www.codeproject.com/Articles/161871/Fast-Colored-TextBox-for-syntax-highlighting