2013-11-01 31 views
14

更新我有一个设置为执行任务,并使用委托的过程我的主UI更新多行文本框背景的工人控制。这是所有正常使用,但一旦更新滚动出文本框的底部,滚动条出现,但持续清爽使文本框上方保持锁定状态。理想情况下,我希望文本框自动滚动到底部以实时显示最新条目。什么是实施这个最好的方法?到自动滚动文本框多的底部由BackgroundWorker的

我已经采用的方法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 

主要BackgroundWorker的活动:

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 

我想我的主要问题是:我敢肯定的是,textbox.scrolltocaret()是正确的方法来使用我想要的东西,但哪里是我放置它的最佳位置?我的runworkerasync()方法之后&尝试过的委托,主要BackgroundWorker的,以及。这些都没有工作,现在我很难过!

回答

22

试试这样说:

'textbox.Text = text 
textbox.AppendText(text) 

你注释掉没有GUI线程上运行,并为M格兰哈指出,AppendText通过将自动滚动到框中的附加文本的代码,所以无需调用ScrollToCaret。

+0

感谢您的响应。我已经将此添加到代表中的IF语句中,现在这可以成为一种享受!最初,它每次刷新都会产生一个有趣的复合消息(1个结果,2个结果,3个结果等)。这原来是因为+ =我在字符串被发送到文本框。这现在已经修复。谢谢! – almg

+2

刚一说明,从[这个答案](http://stackoverflow.com/a/14886915/613438):如果你使用TextBox.AppendText(字符串文本),它会自动滚动到新追加的文本的末尾。如果您在循环中调用它,它将避免闪烁的滚动条。 这也恰好是一个数量级不是连接到。文本属性更快。尽管这可能取决于你打电话的频率。 –

0

xxx.SetFocus 'XXX =文本框

的SendKeys “^ {END}” 的名称' 弹出到最后一行