我有一个文本框的. multiline属性设置为true。每隔一段时间,我都会向它添加新的文本行。我希望文本框自动滚动到最底部的条目(最新的一个)每当添加一个新的行。我该怎么做呢?
当前回答
我发现了一个在这篇文章中没有提到的简单的区别。
如果您将所有ScrollToCarat()调用作为表单的Load()事件的一部分,那么它将不起作用。我只是将ScrollToCarat()调用添加到窗体的Activated()事件中,它工作得很好。
Edit
重要的是,只在第一次触发表单的Activated事件时(而不是在后续激活时)进行这种滚动,否则它将在每次激活表单时进行滚动,这是您可能不希望看到的情况。
因此,如果你只是在程序加载时捕获激活()事件来滚动文本,那么你可以在事件处理程序本身中取消订阅事件,从而:
Activated -= new System.EventHandler(this.Form1_Activated);
如果每次激活表单时都需要做其他事情,则可以在activate()事件第一次触发时将bool值设置为true,这样就不必在后续激活时滚动,但仍然可以做其他需要做的事情。
同样,如果你的文本框在一个不是SelectedTab的标签上,ScrollToCarat()将没有效果。所以你至少需要让它成为滚动时的选定选项卡。你可以将代码包装在YourTab.SuspendLayout();和YourTab.ResumeLayout(假);配对,如果你的形式闪烁时,你这样做。
编辑结束
希望这能有所帮助!
其他回答
我使用了一个函数:
private void Log (string s) {
TB1.AppendText(Environment.NewLine + s);
TB1.ScrollToCaret();
}
您可以使用以下代码片段:
myTextBox.SelectionStart = myTextBox.Text.Length;
myTextBox.ScrollToCaret();
它会自动滚动到最后。
当文本被更改时,这将滚动到文本框的末尾,但仍然允许用户向上滚动
outbox.SelectionStart = outbox.Text.Length;
outbox.ScrollToEnd();
在Visual Studio Enterprise 2017上测试
尝试将建议的代码添加到TextChanged事件:
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.SelectionStart = textBox1.Text.Length;
textBox1.ScrollToCaret();
}
这只对我有用……
txtserialloging ->Text = "";
txtSerialLogging->AppendText(s);
我尝试了上面所有的情况,但问题是,在我的情况下,文本可以减少,增加,也可以长时间保持静态。 静态的意思是,静态的长度(线条)但内容不同。
所以,当长度(行)在一段时间内保持不变时,我在最后面临一个行跳转的情况……
推荐文章
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表
- 等待一个无效的异步方法
- 无法加载文件或程序集…参数不正确
- c#中枚举中的方法
- 如何从字符串中删除新的行字符?
- 使用jQuery滚动到一个div
- 如何设置一个默认值与Html.TextBoxFor?
- 检查属性是否有属性
- 格式化XML字符串以打印友好的XML字符串