如何通过C#中的代码向下滚动文本框

我正在使用winforms,我偶尔会更新一个文本框(显示消息)。 但是,当文本到达框的末尾时,它会生成滚动条,我不知道如何向下滚动到底部。 我唯一看到的是ScrollToCaret,但是Caret正处于文本的开头。 滚动的命令是什么?

您可以通过使用名为ScrollToCaret的函数来完成此操作。 您需要先将插入符号位置设置到文本框的末尾,然后滚动到该文本框。 这是怎么做的:

//move the caret to the end of the text textBox.SelectionStart = textBox.TextLength; //scroll to the caret textBox.ScrollToCaret(); 

这是一个古老的问题,但没有一个建议的答案对我有用(ScrollToCaret()仅在TextBox具有焦点时才有效)。 所以如果在某些时候还有更多人应该搜索这个,我想我会分享我发现的解决方案:

 public class Utils { [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); private const int WM_VSCROLL = 0x115; private const int SB_BOTTOM = 7; ///  /// Scrolls the vertical scroll bar of a multi-line text box to the bottom. ///  /// The text box to scroll public static void ScrollToBottom(TextBox tb) { SendMessage(tb.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); } } 

该解决方案应该在bytes.com上发布: http ://bytes.com/topic/c-sharp/answers/248500-scroll-bottom-textbox#post1005377

如果使用文本框的AppendText()方法,则文本将添加到任何现有文本的底部,控件将滚动以显示它。

您需要在文本末尾设置插入符号:

 textBox1.Text += "your new text"; textBox1.Select(textBox1.Text.Length - 1, 0); textBox1.ScrollToCaret(); 

C#使用Windows API向上/向下滚动(user32.dll)

首先,我们必须定义一个常量值:

 const int EM_LINESCROLL = 0x00B6; const int SB_HORZ = 0; const int SB_VERT = 1; 

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

 [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); 

最后,使用这些方法来做真实的事情:

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

完成! 简单易行! 经测试! 原帖

您可以使用SetScrollPos API:

 [DllImport("user32.dll")] static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); [DllImport("user32.dll")] static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos); const int SB_HORZ = 0; const int SB_VERT = 1; const int SB_CTL = 2; ... void ScrollToBottom(Control ctl) { int min; int max; if (GetScrollRange(ctl.Handle, SB_VERT, out min, out max)) { SetScrollPos(ctl.Handle, SB_VERT, max, true); } } 

(另)

在搜索并且从未找到合法的解决方案,无论是否有焦点以及水平和垂直方式,我偶然发现了一个有效的API解决方案(至少对我的平台来说 – Win7 / .Net4 WinForms)。

 using System; using System.Runtime.InteropServices; namespace WindowsNative { ///  /// Provides scroll commands for things like Multiline Textboxes, UserControls, etc. ///  public static class ScrollAPIs { [DllImport("user32.dll")] internal static extern int GetScrollPos(IntPtr hWnd, int nBar); [DllImport("user32.dll")] internal static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); [DllImport("user32.dll")] internal static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); public enum ScrollbarDirection { Horizontal = 0, Vertical = 1, } private enum Messages { WM_HSCROLL = 0x0114, WM_VSCROLL = 0x0115 } public static int GetScrollPosition(IntPtr hWnd, ScrollbarDirection direction) { return GetScrollPos(hWnd, (int)direction); } public static void GetScrollPosition(IntPtr hWnd, out int horizontalPosition, out int verticalPosition) { horizontalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Horizontal); verticalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Vertical); } public static void SetScrollPosition(IntPtr hwnd, int hozizontalPosition, int verticalPosition) { SetScrollPosition(hwnd, ScrollbarDirection.Horizontal, hozizontalPosition); SetScrollPosition(hwnd, ScrollbarDirection.Vertical, verticalPosition); } public static void SetScrollPosition(IntPtr hwnd, ScrollbarDirection direction, int position) { //move the scroll bar SetScrollPos(hwnd, (int)direction, position, true); //convert the position to the windows message equivalent IntPtr msgPosition = new IntPtr((position << 16) + 4); Messages msg = (direction == ScrollbarDirection.Horizontal) ? Messages.WM_HSCROLL : Messages.WM_VSCROLL; SendMessage(hwnd, (int)msg, msgPosition, IntPtr.Zero); } } } 

使用多行文本框(tbx_main),使用如下:

  int horzPos, vertPos; ScrollAPIs.GetScrollPosition(tbx_main.Handle, out horzPos, out vertPos); //make your changes //something like the following where m_buffer is a string[] tbx_main.Text = string.Join(Environment.NewLine, m_buffer); tbx_main.SelectionStart = 0; tbx_main.SelectionLength = 0; ScrollAPIs.SetScrollPosition(tbx_main.Handle, horzPos, vertPos);