2012-05-21 27 views
6

我有一大串偏移量需要在我的RichTextBox中突出显示。然而,这个过程需要很长时间。我正在使用下面的代码:在RichTextBox中突出显示的时间太长了

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

有没有更有效的方法来做到这一点?

UPDATE:

用这种方法尝试,但它并没有什么突出:如果你设置的SelectionBackColor循环外

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

对不起,我没有意识到这个问题是关于winforms的。我会删除我的答案,让您的问题再次无法解答。 – dasblinkenlight

+0

无论如何感谢@dasblinkenlight – user1135357

+0

[RichTextBox语法实时高亮显示功能的重复 - 禁用重绘](http://stackoverflow.com/questions/3282384/richtextbox-syntax-highlighting-in-real-time-disabling-the -repaint) –

回答

0

这有什么区别?

用Reflector调查RichTextBox显示,每次设置颜色时都会将WindowMessage发送到控件。在大量偏移的情况下,这可能导致突出显示已经突出显示的单词,从而导致O(n^2)行为。

+0

已经尝试过。这不会突出显示任何内容: 'richTextBox.SelectionBackColor = Color.Yellow; foreach(偏移量中的int偏移) { richTextBox.Select(offset,searchString.Length); }' – user1135357

1

我已经使用你的问题,我发现RichTextBox变得很慢,当有很多行。
在我看来,你要么购买第三方控制,你可以通过它的表现来满足,或者你可能需要线程去完成整个选择任务。我认为他们可以加快速度。
希望它有帮助!

+0

我想这[控制](http://www.telerik.com/products/winforms/richtextbox.aspx)将解决我的问题 – user1135357

+0

我听到很多有关telerik和devexpress控件的好消息。所以不要犹豫,向他们揭露你的问题,并看看他们能为你提供什么解决方案。 – HichemSeeSharp

+0

如果您最终得到上述解决方案之一,请将其标记为答案。 – HichemSeeSharp

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; 
    } 
+0

对不起,我并不完全理解你的代码,但是我试图将你的代码复制并粘贴到我的应用程序中,并在每次我想突出显示某些内容时都调用此方法,但它没有根本不工作。无论如何,感谢您的帮助。我放弃! – user1135357

相关问题