Самый быстрый способ добавить текст в richtextbox?

У меня есть приложение с элементом управления RichTextBox, где процедура добавляет текст почти все время:

RichTextBox1.Text += vbNewLine & "Title: " & AlbumName
RichTextBox1.Text += vbNewLine & "Genre: " & AlbumGenre
RichTextBox1.Text += vbNewLine & "Year : " & AlbumYear
RichTextBox1.Text += vbNewLine & "Url  : " & AlbumLink

' The slow thing I think is here:
RichTextBox1.SelectionStart = RichTextBox1.Text.Length

RichTextBox1.ScrollToCaret

Проблема состоит в том, что когда richtextbox имеет более 50 строк, а когда строк больше, добавление нового текста происходит медленнее (очевидно).

Мне нужно найти лучший способ ускорить процесс, потерять хотя бы незначительную скорость, когда число строк richtextbox достигает 1.000 (например).

Причина этого вопроса в том, что я хочу сделать все правильно, я неМне не нравится, когда мое приложение работает медленно, когда в моем richtextbox много строк.

Пожалуйста, мне нужна информация, идеи и / или примеры (неважно, в C # или в VBNET). Спасибо.

 Harald Coppoolse02 мар. 2017 г., 10:42
Если вы хотите добавить только текст в конец, рассмотрите возможность использования RichTextBox.AppendText.
 James Yeoman31 янв. 2017 г., 11:32
Небольшой совет с комментариями к коду VB.Net. У меня лично есть апостроф в конце комментария. Это неНе имеет большого значения для кода (кроме того, что он выглядит немного чище), но он не позволяет текстовым полям на веб-страницах думать, что это просто строка (именно это и сделал ваш ответ). Это немного придирчиво, но выглядит намного лучше, и ваш код будет правильно окрашен.

Ответы на вопрос(5)

Просто установить.Visible вfalseперед добавлением строк текста.

Это остановит перерисовку формы каждый раз, когда вы добавляете строку.

Задавать.Visible вернуться кtrue, когда закончите добавление строк.

Это старый пост, но я хотел помочь будущим поколениям!

у вас была ОДНА И ТО ЖЕ проблема - и, наконец, нашли решение ... Во-первых, если вам не нужно дополнительное форматирование, используйте вместо этого TextBox (из моих исследований этобыстрее и автопрокрутка до конца).

Если вам нужно форматирование отдельных строк текста, RichTextBox - это то, что вам нужно, но УБЕДИТЕСЬ, что вы включаете.HideSelection вfalse (Это'по умолчанию). Это заставит richtextbox прокручиваться до конца, поэтому вам не нужно.ScrollToCaret

Вот что я использую после того, какМы установили все значения свойств для расширенного текстового поля:

private void appendOutput(String msg){
    richTextBoxOutput.AppendText(msg + "\r\n");
}


private void appendError(String msg, bool clearPrior){
    if (clearPrior){
        richTextBoxOutput.Clear();
    }

    richTextBoxOutput.SelectionColor = Color.Red;
    richTextBoxOutput.SelectedText = msg + "\r\n";
}

ОБНОВИТЬ

Чтобы быть более понятным, настройка.HideSelection вfalse и избегая.ScrollToCaret значительно улучшил мою программуСкорость.

 sudo rm -rf slash02 нояб. 2018 г., 11:40
Есть так много сообщений по этому вопросу, но это тот, который нажал для меня
Решение Вопроса

ИспользоватьStringBuilder и назначить текст за один раз.

Если вы не переписываете элемент управления RichTextBox, я не думаю, что вы 'Вы сможете ускорить эту функцию:

' The slow thing I think is here:
RichTextBox1.SelectionStart = RichTextBox1.Text.Length 

Для лучшей скорости рассмотрите эти альтернативы:

Фаст-Colored-TextBox-для-подсветку синтаксиса

ScintillaNET

Icsharpcode TextEditor

Вот как вы можете закончить прокрутку:Fast-Colored-TextBox-for-syntax-highlighting

 Editor.ScrollLeft();
 Editor.Navigate(Editor.Lines.Count - 1);

Вот как вы можете закончить прокрутку:Scintella.NetТекстовое поле Scintilla с вертикальной прокруткой во время события Text Changed Отказ от ответственности: я не работаю ни на одну из этих компаний.

Обновить:

StringBuilder sb = new StringBuilder();
sb.AppendLine("Title: ");
sb.Append(AlbumName);
sb.AppendLine("Genre: ");
sb.Append(AlbumGenre);
sb.AppendLine("Year : ");
sb.Append(AlbumYear);
sb.AppendLine("Url  : ");
sb.Append(AlbumLink);
RichTextBox1.Text = sb.ToString();
 ElektroStudios23 мая 2013 г., 03:51
Не могли бы вы добавить в свой ответ пример StringBuilder, взяв в качестве примера строки моего примера? Как это было бы использовать stringbuilder? Я напрямую заменяю текст richtextbox текстом строки или ... как?
 Jeremy Thompson23 мая 2013 г., 03:56
@ ElektroHacker посмотри мое обновление :)
 Everyone22 дек. 2016 г., 03:10
не должен»т этоRichTextBox1.Text = sb.ToString(); быть какRichTextBox1.Text += sb.ToString(); ? Вы сбрасываете richtextbox ' текст каждый раз, нет?
 Half_Baked02 дек. 2013 г., 01:02
StringBuilder был действительно быстрым, когда добавлял большие кускистрока-данные» в RichTextBox
 Jeremy Thompson22 дек. 2016 г., 03:12
Нет, дело в том, чтобы сделать всю конкатенацию с использованием строителя строк. Назначая его один раз, это ключ, потому что RichTextBox 's Свойство Text является строкой, а строки неизменяемы.
 Chad21 дек. 2016 г., 16:53
Почему неВы используетеsb.AppendLine(...) вместо ?sb.Append(Environment.NewLine + ...)
 ElektroStudios23 мая 2013 г., 04:06
Спасибо яЯ сейчас вне времени, я попробую все ответы позже "быстро окрашенный и принять ответ, еще раз спасибо.

StringBuilder класс был построен для скорости. Попробуйте и посмотрите, не ускоряет ли это ваш процесс.

 ElektroStudios23 мая 2013 г., 03:51
Не могли бы вы добавить в свой ответ пример StringBuilder, взяв в качестве примера строки моего примера? Как это было бы использовать stringbuilder? Я напрямую заменяю текст richtextbox текстом строки или ... как?
 ElektroStudios23 мая 2013 г., 10:30
спасибо за Ваш ответ

Если первый предложенный вариант нет работать на вас, вы можете попробовать следующее. Это's в C #, но я уверен, что вы можете конвертировать его для VB.

    StringBuilder text = new StringBuilder(RichTextBox1.Text);
    text.AppendFormat("{0}Title: {1}", Environment.NewLine, AlbumName);
    text.AppendFormat("{0}Genre: {1}", Environment.NewLine, AlbumGenre);
    text.AppendFormat("{0}Year: {1}", Environment.NewLine, AlbumYear);
    text.AppendFormat("{0}Url: {1}", Environment.NewLine, AlbumLink);

    RichTextBox1.Text = text.ToString();
    RichTextBox1.SelectionStart = RichTextBox1.Text.Length;
    RichTextBox1.ScrollToCaret;
 ElektroStudios23 мая 2013 г., 10:30
спасибо за Ваш ответ

Ваш ответ на вопрос