1. ホーム
  2. c#

[解決済み] 複数行のテキストボックスの一番下まで自動的にスクロールするにはどうしたらいいですか?

2022-02-12 11:10:03

質問内容

テキストボックスに.Multilineプロパティがtrueに設定されています。 一定の間隔で、新しいテキスト行を追加しています。 新しい行が追加されるたびに、テキストボックスが自動的に一番下の項目(最新のもの)にスクロールするようにしたいのですが、可能でしょうか? どうすれば実現できるでしょうか?

どのように解決するのですか?

<ブロッククオート

一定時間ごとに、新しい行を追加しています。新しい行が追加されるたびに、テキストボックスが自動的に一番下のエントリ(最新のもの)にスクロールするようにしたいのです。

を使用する場合 TextBox.AppendText(string text) の場合、新しく追加されたテキストの終わりまで自動的にスクロールします。ループで呼び出す場合は、スクロールバーのちらつきを避けることができます。

に連結するよりも一桁速くなります。 .Text プロパティを使用します。ただし、これは呼び出す頻度によるかもしれません。私はタイトなループでテストしていました。


テキストボックスが表示される前に呼び出された場合、またはテキストボックスが表示されていない場合(たとえば TabPanel の別のタブにある場合)には、これはスクロールしません。参照 TextBox.AppendText()が自動スクロールしない件 . これは、ユーザーがテキストボックスを見ることができないときに自動スクロールを必要とするかどうかによって、重要であったりなかったりします。

この場合、他の回答で紹介されている代替方法もうまくいかないようです。これを回避する一つの方法として VisibleChanged イベントが発生します。

textBox.VisibleChanged += (sender, e) =>
{
    if (textBox.Visible)
    {
        textBox.SelectionStart = textBox.TextLength;
        textBox.ScrollToCaret();
    }
};


内部的には AppendText は、こんな感じです。

textBox.Select(textBox.TextLength + 1, 0);
textBox.SelectedText = textToAppend;

しかし、手動で行う理由はないはずです。

(自分で逆コンパイルしてみると、より効率的な内部メソッドが使われている可能性があることや、ちょっとした特殊ケースと思われるものがあることがわかると思います)。