我有一个文本框的. multiline属性设置为true。每隔一段时间,我都会向它添加新的文本行。我希望文本框自动滚动到最底部的条目(最新的一个)每当添加一个新的行。我该怎么做呢?
当前回答
对于登陆这里希望看到webforms实现的其他人,您应该使用Page Request Manager的endRequest事件处理程序(https://stackoverflow.com/a/1388170/1830512)。以下是我在母版页的内容页中为我的文本框所做的,请忽略我没有为控件使用变量的事实:
var prm = Sys.WebForms.PageRequestManager.getInstance();
function EndRequestHandler() {
if ($get('<%= ((TextBox)StatusWindow.FindControl("StatusTxtBox")).ClientID %>') != null) {
$get('<%= ((TextBox)StatusWindow.FindControl("StatusTxtBox")).ClientID %>').scrollTop =
$get('<%= ((TextBox)StatusWindow.FindControl("StatusTxtBox")).ClientID %>').scrollHeight;
}
}
prm.add_endRequest(EndRequestHandler);
其他回答
每隔一段时间,我都会向它添加新的文本行。我希望文本框自动滚动到最底部的条目(最新的一个)每当添加一个新的行。
如果你使用文本框。AppendText(字符串文本),它将自动滚动到新追加的文本的末尾。如果在循环中调用它,它可以避免滚动条的闪烁。
它也恰好比连接到. text属性快一个数量级。尽管这可能取决于你调用它的频率;我在用一个紧循环测试。
如果它在文本框显示之前被调用,或者如果文本框不可见(例如在TabPanel的不同选项卡中),它将不会滚动。请参阅TextBox.AppendText()而不是自动滚动。这可能很重要,也可能不重要,这取决于当用户看不到文本框时是否需要自动滚动。
在这种情况下,其他答案的替代方法似乎也不管用。一种解决方法是在VisibleChanged事件上执行额外的滚动:
textBox.VisibleChanged += (sender, e) =>
{
if (textBox.Visible)
{
textBox.SelectionStart = textBox.TextLength;
textBox.ScrollToCaret();
}
};
在内部,AppendText做了这样的事情:
textBox.Select(textBox.TextLength + 1, 0);
textBox.SelectedText = textToAppend;
但不应该有理由手动完成。
(如果你自己反编译它,你会发现它使用了一些可能更有效的内部方法,并且似乎有一个小的特殊情况。)
在。net 4.0中,接口似乎发生了变化。以下方法可以实现上述所有功能。正如Tommy Engebretsen所建议的,将其放在TextChanged事件处理程序中可以使其自动完成。
textBox1.ScrollToEnd();
我发现了一个在这篇文章中没有提到的简单的区别。
如果您将所有ScrollToCarat()调用作为表单的Load()事件的一部分,那么它将不起作用。我只是将ScrollToCarat()调用添加到窗体的Activated()事件中,它工作得很好。
Edit
重要的是,只在第一次触发表单的Activated事件时(而不是在后续激活时)进行这种滚动,否则它将在每次激活表单时进行滚动,这是您可能不希望看到的情况。
因此,如果你只是在程序加载时捕获激活()事件来滚动文本,那么你可以在事件处理程序本身中取消订阅事件,从而:
Activated -= new System.EventHandler(this.Form1_Activated);
如果每次激活表单时都需要做其他事情,则可以在activate()事件第一次触发时将bool值设置为true,这样就不必在后续激活时滚动,但仍然可以做其他需要做的事情。
同样,如果你的文本框在一个不是SelectedTab的标签上,ScrollToCarat()将没有效果。所以你至少需要让它成为滚动时的选定选项卡。你可以将代码包装在YourTab.SuspendLayout();和YourTab.ResumeLayout(假);配对,如果你的形式闪烁时,你这样做。
编辑结束
希望这能有所帮助!
您可以使用以下代码片段:
myTextBox.SelectionStart = myTextBox.Text.Length;
myTextBox.ScrollToCaret();
它会自动滚动到最后。
我使用了一个函数:
private void Log (string s) {
TB1.AppendText(Environment.NewLine + s);
TB1.ScrollToCaret();
}
推荐文章
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?
- String与StringBuilder
- 如何在ASP中使用ILogger进行单元测试。网络核心