自动滚动到由后台工作人员更新的多行文本框的底部

alm*_*lmg 15 vb.net scroll textbox backgroundworker

我有一个后台工作程序控件,用于执行任务,并使用委托过程更新主UI上的多行文本框.这是所有正常使用,但一旦更新滚动出文本框的底部,滚动条出现,但持续清爽使文本框上方保持锁定状态.理想情况下,我希望文本框自动滚动到底部以实时显示最新条目.实现这个的最佳方法是什么?

我已尝试使用该scrolltocaret()方法,有或没有在SelectionStart = txtlog.Text.Length它之前的命令.也许我把它放在错误的地方?

下面是一些代码示例:

委托代码:

Delegate Sub updateresults_delegate(ByVal textbox As TextBox, ByVal text As String)

Private Sub updatelog_threadsafe(ByVal textbox As TextBox, ByVal text As String)
            If textbox.InvokeRequired Then
                Dim mydelegate As New updateresults_delegate(AddressOf updatelog_threadsafe)
                Me.Invoke(mydelegate, New Object() {textbox, text})
                'Me.txtlog.SelectionStart = txtlog.Text.Length
                'Me.txtlog.ScrollToCaret()
            Else
                textbox.Text = text
            End If
        End Sub
Run Code Online (Sandbox Code Playgroud)

主要背景工作者活动:

For i As Integer = val1 To val2
'generate an IP address from split host parts and current value of i
                host = s1(0) & "." & s1(1) & "." & s1(2) & "." & i
                Try 'attempt to ping the IP
                    Dim reply As PingReply = pingsender.Send(host, timeoutval, buffer, options)
                    If reply.Status = IPStatus.Success Then
                        name = System.Net.Dns.GetHostEntry(host)'get DNS entry
                        resulttext += String.Format("{1} - {2}: reply: Bytes={3} time{4} TTL={5}{0}", vbCrLf, name.HostName, reply.Address.ToString, reply.Buffer.Length, getms(reply.RoundtripTime), reply.Options.Ttl) 'print out success text
                    Else
                        resulttext += String.Format("      {1}: Ping failed. {2}{0}", vbCrLf, host, reply.Status.ToString) 'print out fail text
                    End If
                    updatelog_threadsafe(txtlog, resulttext) 'send text to textbox

            System.Threading.Thread.Sleep(1000)
        Catch ex As Exception

        End Try
    Next
Run Code Online (Sandbox Code Playgroud)

我想我的主要问题是:我很确定这textbox.scrolltocaret()是我想要的正确方法,但我最好放在哪里?我已经在委托,主要的背景工作者以及方法之前和之后尝试过它runworkerasync().这些都没有奏效,现在我很难过!

Lar*_*ech 24

试试这种方式:

'textbox.Text = text
textbox.AppendText(text)
Run Code Online (Sandbox Code Playgroud)

您注释掉的代码没有在GUI线程上运行,正如M Granja所指出的,AppendText将自动滚动到框中的附加文本,因此无需调用ScrollToCaret.

  • 只需注意,从[此答案](http://stackoverflow.com/a/14886915/613438):如果您使用TextBox.AppendText(字符串文本),它将自动滚动到新附加文本的末尾.如果你在循环中调用它,它可以避免闪烁的滚动条.它也恰好比连接到.Text属性快一个数量级.虽然这可能取决于你调用它的频率; (2认同)