将文本追加到richtextbox的最快方式

本文关键字:方式 richtextbox 文本 追加 | 更新日期: 2023-09-27 18:14:51

我有一个应用程序与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 line-count达到1.000(例如)时,至少要失去一个微不足道的速度。

这个问题的原因是因为我想做的事情在正确的方式,我不喜欢我的应用程序是缓慢的,当我的richtextbox有很多行。

请,我需要的信息,想法和/或例子(无论是在c#或VBNET)。谢谢。

将文本追加到richtextbox的最快方式

这是一个较老的帖子-但我想帮助后代!

我一直有同样的问题-最后找到了一个解决方案…首先,如果你不需要额外的格式,使用文本框代替(从我的研究,它更快,并自动滚动到最后)。

如果你需要格式化单独的文本行,RichTextBox是去的方式,但确保你把.HideSelectionfalse(这是真的默认情况下)。这将导致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";
}

更清楚,设置.HideSelectionfalse,避免.ScrollToCaret大大提高了我的程序的速度。

使用StringBuilder并一次分配文本。

除非你重写RichTextBox控件,我不认为你将能够加快这个功能:

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

为了获得更好的速度,请考虑以下选择:

Fast-Colored-TextBox-for-syntax-highlighting

ScintillaNET

Icsharpcode TextEditor


下面是你如何滚动以Fast-Colored-TextBox-for-syntax-highlighting结尾:

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

下面是你如何滚动到Scintella.Net结束:在文本更改事件期间垂直滚动闪烁文本框免责声明:我没有为这些公司工作。

更新:

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();

如果第一个建议的选项不适合您,您可以尝试以下选项。它是在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;

StringBuilder类是为速度而构建的。试一下,看看这是否能加快你的进程。

在添加文本行之前,只需将.Visible设置为false

它将阻止窗体在每次添加一条线时重新绘制。

.Visible设置为true,当添加行完成后