【问题标题】:Fastest way to append text to a richtextbox?将文本附加到富文本框的最快方法?
【发布时间】:2018-11-27 05:05:48
【问题描述】:

我有一个带有 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

问题是当丰富文本框有大约 50 多行时,当有更多行时,附加新文本的速度会更慢(很明显)。

我需要找到一种更好的方法来加速这个过程,当 Richtextbox 行数达到 1.000 时(例如),至少要降低一个微不足道的速度。

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

请,我需要信息、想法和/或示例(无论是 C# 还是 VBNET)。 谢谢。

【问题讨论】:

  • VB.Net 代码 cmets 的小技巧。我个人在评论末尾有一个撇号。它对代码没有太大影响(除了看起来稍微干净一些),但它可以防止网页中的文本框认为它只是一个字符串(这就是你的答案所做的)。它有点挑剔,但看起来好多了,并且您的代码将正确着色。
  • 如果只想在末尾添加文字,可以考虑使用RichTextBox.AppendText。

标签: c# .net vb.net richtextbox


【解决方案1】:

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

我一直遇到同样的问题 - 终于找到了解决方案... 首先,如果您不需要额外的格式,请改用 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 大大提高了我的程序的速度。

【讨论】:

  • 关于这个问题的帖子很多,但这是我点击的那个
【解决方案2】:

使用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 结尾的方法: Vertical scroll Scintilla Textbox during Text Changed event 免责声明:我不为这些公司工作。

更新:

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

【讨论】:

  • 您能否在您的答案中添加一个 StringBuilder 示例,并参考我的示例代码行?它将如何使用 stringbuilder?我直接用 stringbuilder 文本替换了 Richtextbox 文本,或者......如何?
  • 谢谢,我现在没时间了,我稍后会尝试所有答案,也可以“快速着色”并接受答案,再次感谢。
  • StringBuilder 在向 RichTextBox 添加大块“字符串数据”时非常快
  • 你为什么不用sb.AppendLine(...) 而不是sb.Append(Environment.NewLine + ...)
  • 没有诀窍是使用字符串生成器进行所有连接。因为 RichTextBox 的 Text 属性是字符串且字符串是不可变的,所以一旦键就分配它。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    StringBuilder 类是为提高速度而构建的。试试看,看看这是否会加快你的进程。

    【讨论】:

    • 您能否在您的答案中添加一个 StringBuilder 示例,并参考我的示例代码行?它将如何使用 stringbuilder?我直接用 stringbuilder 文本替换了 Richtextbox 文本,或者......如何?
    【解决方案5】:

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

    每次添加一行时,它都会阻止表单重绘。

    添加行后,将.Visible 设置回true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2019-11-13
      • 2020-03-12
      相关资源
      最近更新 更多