5

我有一个带有 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)。谢谢你。

4

5 回答 5

13

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

我一直有同样的问题 - 终于找到了解决方案......首先,如果您不需要额外的格式,请改用 TextBox (根据我的研究,它更快并且自动滚动到最后)。

如果您需要对单个文本行进行格式化,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大大提高了我的程序的速度。

于 2015-08-06T16:58:28.617 回答
6

一次性使用StringBuilder并分配文本。

除非您重写 RichTextBox 控件,否则我认为您无法加快此功能:

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

为了获得更好的速度,请考虑以下替代方案:

Fast-Colored-TextBox-for-syntax-highlighting

闪烁网络

Icsharpcode 文本编辑器


以下是您如何进行滚动以结束Fast-Colored-TextBox-for-syntax-highlighting

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

以下是滚动结束的方式Scintella.NetText Changed 事件期间垂直滚动 Scintilla Textbox 免责声明:我不为这些公司工作。

更新:

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();
于 2013-05-23T01:17:47.043 回答
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;
于 2013-05-23T01:56:27.767 回答
2

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

于 2013-05-23T01:18:26.627 回答
0

只需设置.Visiblefalse, 在添加文本行之前。

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

完成添加行后,设置.Visible回。true

于 2018-11-26T20:05:24.123 回答