关于c#:更改TextBox中的滚动条位置?

Change scrollbar position in TextBox?

如果我想更改TextBox滚动条的位置,除了此以外,我还需要做什么:

1
SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

此功能仅更改滚动条的位置,但不会更新实际的TextBox(因此滚动条"滚动",但文本不会)。有什么建议么?我正在将Windows Forms和.NET 4与Visual Studio 2008一起使用。


我通常这样做:

1
2
textBox1.Select(textBox1.Text.Length, 0);
textBox1.ScrollToCaret();

在这里选择0个字符只会将光标移动到所需位置(在示例代码中:文本的末尾)。


首先,定义一个常量值:

1
const int EM_LINESCROLL = 0x00B6;

然后,声明user32.dll的两个外部方法:

1
2
3
4
5
6
[DllImport("user32.dll")]
static extern int SetScrollPos(IntPtr hWnd, int nBar,
                               int nPos, bool bRedraw);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int wMsg,
                               int wParam, int lParam);

最后,使用以下方法做真实的事情:

1
2
3
SetScrollPos(myTextBox.Handle,1,myTextBox.Lines.Length-1,true);
SendMessage(myTextBox.Handle,EM_LINESCROLL,0,
                             myTextBox.Lines.Length-1);

当文本框更新时,您也可以使用GetScrollPos()来保存滚动位置:

1
2
[DllImport("user32.dll")]
static extern int GetScrollPos(IntPtr hWnd, int nBar);


请尝试避免直接控制此操作,否则效果确实不佳。设置TextBox.SelectionStart属性,以确保插入符号是您要使其可见的行。然后调用ScrollToCaret。控件必须具有重点才能完成这项工作。您的用户可以轻松找到它。

TextBox是控件祖父的package器,它已经23岁了,比我认为的许多SO用户都要老。当640 KB对每个人来说都是足够的,而Window 2.0必须在386SUX或更少的操作系统上运行时。 WPF版本具有更多的口哨声。