我有一个很大的偏移列表,我需要在我的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);
}
答案 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)行为。