写入新数据时,“富文本”框将滚动到底部

我的程序调用 Java,然后将 stdout 重定向到 RichTextBox。我的问题是,每次写入数据时,垂直滚动条总是停留在框的顶部。

即使你滚动到底部,一旦新的数据被写入它去顶部。我希望恰恰相反。

因此,当写入新数据时,它停留在底部。我如何做到这一点?

142544 次浏览

Yes, you can use the ScrollToCaret() method:

// bind this method to its TextChanged event handler:
// richTextBox.TextChanged += richTextBox_TextChanged;
private void richTextBox_TextChanged(object sender, EventArgs e) {
// set the current caret position to the end
richTextBox.SelectionStart = richTextBox.Text.Length;
// scroll it automatically
richTextBox.ScrollToCaret();
}

When writing new data, if you use AppendText() it wont scroll up and will always stay at the bottom.

The RichTextBox will stay scrolled to the end if it has focus and you use AppendText to add the information. If you set HideSelection to False it will keep its selection when it loses focus and stay auto scrolled.

I designed a Log Viewer GUI that used the method below. It used up to a full core keeping up. Getting rid of this code and setting HideSelection to False got the CPU usage down to 1-2%

//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();

This is an old question, but I had this problem and I used the richTextBox_TextChanged event as above, which works. But I feel this is a workaround and wanted to document the actual solution in case anybody else looks for it.

If you append it will auto-scroll, however the RichTextBox has to be focused. So call Focus before AppendText to make sure it auto-scrolls.

richTextBox.Focus();


richTextBox.AppendText(text);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
private const int WM_VSCROLL = 277;
private const int SB_PAGEBOTTOM = 7;


internal static void ScrollToBottom(RichTextBox richTextBox)
{
SendMessage(richTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
richTextBox.SelectionStart = richTextBox.Text.Length;
}

ScrollToBottom(richTextBox);

by using above method you can scroll rich text box to bottom

I'll keep it simple:

  • Set HideSelection property to false

  • Use AppendText() method to add text to RichTextBox.

Code:

RichTextBox rtbTest;


void InitRichTextBox()
{
//Init rtbTest...


rtbTest.HideSelection = false;//Hide selection so that AppendText will auto scroll to the end
}


void AddText(string txt)
{
rtbTest.AppendText(txt);
}