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 行以上ある場合です。それ以上の行がある場合、新しいテキストを追加するのが遅くなります (明らかです)。

リッチテキストボックスの行数が 1.000 (たとえば) に達したときに、少なくともわずかな速度を失うために、プロセスを加速するためのより良い方法を見つける必要があります。

この質問の理由は、正しい方法で物事をやりたいからです。リッチテキストボックスに多くの行があると、アプリが遅くなるのが好きではありません。

情報、アイデア、および/または例が必要です (C# か VBNET かに関係なく)。ありがとうございました。

4

5 に答える 5

13

これは古い投稿ですが、私は将来の世代を助けたかったのです!

私は同じ問題を抱えていました-そして最終的に解決策を見つけました...最初に、余分な書式設定が必要ない場合は、代わりに TextBox を使用します(私の研究では、高速で最後まで自動スクロールします)。

テキストの個々の行の書式設定が必要な場合は、RichTextBox が最適ですが、必ず使用.HideSelectionしてくださいfalse(デフォルトでは true です)。これにより、リッチテキストボックスが最後までスクロールするため、必要はありません.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

a を使用してStringBuilderText を一度に割り当てます。

RichTextBox コントロールを書き直さない限り、この関数を高速化できるとは思いません。

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

速度を上げるには、次の代替案を検討してください。

Fast-Colored-TextBox-for-syntax-highlighting

シンティラネット

Icsharpcode TextEditor


スクロールして終了する方法は次のFast-Colored-TextBox-for-syntax-highlightingとおりです。

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

スクロールを終了する方法は次のScintella.Netとおりです 。 Text Change イベント中の垂直スクロール 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 に答える