Выделение многофункционального текстового поля с огромным текстом в форме окна
У меня есть огромные текстовые файлы, которые я обрабатываю построчно и добавляю результаты в StringBuilder
поэтому я не держу основную форму с загрузкой в нее отдельных строк текста.
После завершения обработки я вывожу результат в richtext textbox
, Я хочу выделить часть текста на основе моих ключевых слов. Я заканчиваю тем, что использую строку. Найдите по всему тексту каждое слово, чтобы выделить его. Я попытался создать поток, чтобы выделить текст с помощью лямбда-выражения richbox.BeginInvoke. Поток работает нормально, но обрабатывает текстовое поле и работает очень медленно.
Как мне пройти через richtext box
построчно и выделите несколько слов с понятной производительностью, учитывая 50-100 МБ текста?
Этот вопрос был перенесен из супер пользователя, потому что его программирование актуально. Есть несколько предлагаемых решений, таких как: 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();
Текст загружен, но не выделяет текст или текст, который я добавлю позже
1 ответ
Можете ли вы использовать внешние библиотеки?
Тогда как насчет Scintilla.Net
Это действительно хорошее и быстрое управление подсветкой на основе Scintilla (SciTE, Notepad++)