在窗口窗体中有效地突出显示带有大文本的富文本框
本文关键字:文本 显示 窗体 窗口 有效地 | 更新日期: 2023-09-27 17:56:13
我有巨大的文本文件,我逐行处理并将结果添加到StringBuilder
这样我就不会在主表单中加载单行文本。
处理完成后,我将结果转储到richtext textbox
。我想根据我的关键字突出显示一些文本。我最终使用了一个字符串。在每个单词的所有文本上查找以突出显示它。我尝试有一个线程来突出显示带有 lambda 表达式富箱的文本。开始调用。线程工作正常,但将句柄放在富文本框上并且非常慢。
考虑到 50-100 MB 的文本,我如何逐行循环浏览richtext box
并以可理解的性能突出显示其中的一些单词?
这个问题已经从超级用户移出,因为它的编程相关。有一些建议的解决方案,例如:http://www.dotnetcurry.com/ShowArticle.aspx?ID=146和http://www.codeproject.com/Articles/4031/Background-Highlighting-with-the-RichTextBox-the-S,但它们对于大文本仍然效率低下。
foreach (string x in LArgs)
{
int len =0;
int index = 0;
int lastIndex=0;
output.Invoke(() => { len=output.Text.Length; });
output.Invoke(() => { lastIndex=output.Text.LastIndexOf(x); });
while (index < lastIndex)
{
output.Invoke(() => { output.Find(x, index, len, RichTextBoxFinds.None); });
output.Invoke(() => { this.output.SelectionBackColor = Color.Yellow; });
output.Invoke(() => { index = this.output.Text.IndexOf(x, index) + 1; });
}
}
我添加了库并使用以下代码:
scintilla1.Text = output.Text;
StringBuilder conf = new StringBuilder();
conf.AppendLine("<?xml version='"1.0'" encoding='"utf-8'" ?>");
conf.AppendLine(@"<ScintillaNET>");
conf.AppendLine("<Language Name='"log'">");
conf.AppendLine("<lexer LexerName='"log'">");
conf.AppendLine("<Keywords List='"0'">");
foreach (string x in LArgs)
{
conf.Append(x + " ");
}
//var
conf.AppendLine("</Keywords>");
conf.AppendLine(@"</lexer >");
conf.AppendLine(@"<Styles>");
conf.AppendLine(@"</Language>");
conf.AppendLine(@"</ScintillaNET>");
File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory+@"ScintillaNET.xml", conf.ToString());
scintilla1.Lexing.LexerLanguageMap["log"] = "cpp";
scintilla1.ConfigurationManager.CustomLocation = AppDomain.CurrentDomain.BaseDirectory + @"ScintillaNET.xml";
scintilla1.ConfigurationManager.Language = "log";
scintilla1.ConfigurationManager.Configure();
文本已加载,但它没有突出显示任何文本或我稍后添加的任何文本
你能使用 extern 库吗?
那 Scintilla.Net 呢
这是一个非常好的快速高亮控件,基于Scintilla(SciTE,Notepad++)