複数行のテキスト ボックスの一番下まで自動的にスクロールするにはどうすればよいでしょうか? 質問する

複数行のテキスト ボックスの一番下まで自動的にスクロールするにはどうすればよいでしょうか? 質問する

.Multiline プロパティが true に設定されたテキスト ボックスがあります。定期的に、新しいテキスト行を追加しています。新しい行が追加されるたびに、テキスト ボックスが最下部のエントリ (最新のエントリ) に自動的にスクロールされるようにしたいと思います。これを実現するにはどうすればよいでしょうか。

ベストアンサー1

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

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

また、プロパティに連結するよりも桁違いに高速です.Text。ただし、これは呼び出す頻度によって異なる可能性があります。私はタイトなループでテストしていました。


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

この場合、他の回答の代替方法も機能しないようです。回避策の 1 つは、イベントで追加のスクロールを実行することですVisibleChanged

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

内部的には、AppendText次のようになります:

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

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

(自分で逆コンパイルすると、おそらくより効率的な内部メソッドがいくつか使用されており、小さな特殊なケースがあるように見えることがわかります。)

おすすめ記事