vb.net - 自动滚动到多行文本框的底部

标签 vb.net winforms textbox visual-studio-2015

我已经开始为一个小项目制作一个主服务器程序,该程序涉及在较新的引擎上重建游戏。
主服务器程序当前如下所示:

带有“找到4个已安装的处理器”的大文本框是一个“控制台”,该控制台输出使用主服务器发送到客户端/游戏服务器以及从客户端/游戏服务器发送来的原始事件消息。不能输入,管理员(唯一有权访问主服务器程序此界面的人)只能从文本框中进行复制;他们无法删除/添加任何内容。

问题在于,因为它应该是“控制台”,所以它应该自动向下滚动到多行文本框的最后一行。

关于堆栈溢出有很多问题可以解决此问题(例如this one),但是在将代码放入console_TextChanged子例程中时,我无法使其工作(文本框不会向下滚动)。
我已经试过了:

Private Sub console_TextChanged(sender As Object, e As EventArgs) Handles console.TextChanged
    console.AppendText(Text)
    console.Select(console.TextLength, 0)
    console.ScrollToCaret()
End Sub

它不起作用,但是确实会导致程序中的错误,该行中的每一行都多次附加了程序的标题:
[net 11:32:22.243] System Started.Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5Server Network | Crysis Wars 1.5

过去,某些C#解决方案在Visual Basic .Net中也为我工作,因此我尝试了some of the ones on Stack Overflow,但我也无法使其正常工作。

这真的是自动滚动多行文本框的正确方法吗?如果是,为什么它对我不起作用?

完整(相关)代码:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    console.Text = GetNetTime() + "System Started."
    WriteToConsole("Working Area: " + CStr(My.Computer.Screen.WorkingArea().Width) + "*" + CStr(My.Computer.Screen.WorkingArea().Height))
    WriteToConsole("Found " + CStr(Environment.ProcessorCount) + " installed processor(s)")
    Dim i As Integer = 0
    While (i < Environment.ProcessorCount)
        WriteToConsole("Processor " + CStr(i) + ": " + My.Computer.Registry.LocalMachine.OpenSubKey("Hardware\Description\System\CentralProcessor\" + CStr(i)).GetValue("ProcessorNameString"))
        WriteToConsole("            Family: " + My.Computer.Registry.LocalMachine.OpenSubKey("Hardware\Description\System\CentralProcessor\" + CStr(i)).GetValue("Identifier"))
        WriteToConsole("            Manufacturer: " + My.Computer.Registry.LocalMachine.OpenSubKey("Hardware\Description\System\CentralProcessor\" + CStr(i)).GetValue("VendorIdentifier"))
        i += 1
    End While
    WriteToConsole("Starting networking services")
End Sub
Private Sub console_TextChanged(sender As Object, e As EventArgs) Handles console.TextChanged
    console.AppendText(Text)
    console.Select(console.TextLength, 0)
    console.ScrollToCaret()
End Sub
Function GetNetTime()
    Return "[net " + CStr(DateTime.UtcNow.Hour) + ":" + CStr(DateTime.UtcNow.Minute) + ":" + CStr(DateTime.UtcNow.Second) + "." + CStr(DateTime.UtcNow.Millisecond) + "] "
End Function
Function WriteToConsole(ByVal input As String)
    console.AppendText(Environment.NewLine & GetNetTime() + input)
    Return -1
End Function

最佳答案

如果您使用的是AppendText,则可以完全摆脱该console_TextChanged方法,因为AppendText已经为您完成了此操作。

由于某种原因(可能是错误?),当TextBox没有显示在屏幕上时,AppendText似乎没有滚动到结尾。我现在没有很好的解释,需要查看.Net框架源代码。

解决方法是将所有代码移到MyBase.Shown事件,而不是Load事件。可以按预期工作,不同之处在于,首先在屏幕上呈现表单后,就会立即引发Shown事件,而不是在呈现表单之前就触发了Load

关于vb.net - 自动滚动到多行文本框的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26586675/

相关文章:

c# - 某些用户的 ASP.NET 转发器控件重叠

.net - 获取自定义用户控件中声明的事件的所有事件处理程序

javascript - 如何使父网页从 iframe 滚动到特定位置(顶部)

vb.net - 自动滚动到由 backgroundworker 更新的多行文本框的底部

windows-phone-7 - 在 WP7 中,当页面上存在 WebBrowser 控件时,TextBox.Focus() 不起作用

c# - 如何防止代码隐藏中的属性的 HTML 编码?

c# - Winform,TableLayoutPanel 在动态控件添加/删除时闪烁?

c# - Windows 窗体 C# 项目中的嵌入式 WebBrowser

c# - 当鼠标按钮在操作系统中交换时,鼠标单击事件处理程序是否仍然可以根据单击哪个按钮正常工作?

jquery - 如何在文本框中使用 Enter 键来触发功能而不是第一个/默认按钮