我试图做一个" rotator"在一个循环显示一系列网址的表单上,并在WebBrowser
控件中显示该网址。下面的代码显示我的表单,但表单保持白色/空白,然后一段时间后出现数组中的最后一个url。当我在每个网址之间放置一个MessageBox
时,为了创建一个停靠点,它会起作用并且每个网址都会出现。我尝试用Sleep
代替MessageBox
,但这不起作用。我也试过增加Sleep
时间,但这也没有用。如何使其正常工作?
Sub Rotate()
Dim Urls() As String = {"www.stackoverflow.com", "www.google.com", "www.yahoo.com"}
Dim counter As Integer = 0
Form3.Show()
Do Until counter = 3
Form3.WebBrowser1.ScriptErrorsSuppressed = True
Form3.WebBrowser1.Navigate(Urls(counter))
'MessageBox.Show("Next")
counter = counter + 1
System.Threading.Thread.Sleep(2000)
Loop
End Sub
答案 0 :(得分:0)
您可以在更改URL后调用Application.DoEvents,以便控件有机会重绘自己
但是,更好的方法是使用timer每2秒触发一次,然后更改事件处理程序中的URL,以便UI保持响应。
例如,在表单中设置一个新字段myTimer
,在表单的加载事件中启动它,并在Tick
事件中调用您的Rotate
方法。由于现在多次调用Rotate
,我们必须将counter
变量移出方法并使其成为一个字段,以便我们在调用之间保持其值。我经常写C#所以希望我没有在下面做一些拼写错误:)
Private WithEvents myTimer As System.Windows.Forms.Timer
Private counter As Integer
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' ... your existing code ...
counter = 0
myTimer = New System.Windows.Forms.Timer
myTimer.Interval = 2000
myTimer.Enabled = True
myTimer.Start()
End Sub
Private Sub myTimerTick() Handles myTimer.Tick
Rotate()
End Sub
Sub Rotate()
Dim Urls() As String = {"www.stackoverflow.com", "www.google.com", "www.yahoo.com"}
WebBrowser1.ScriptErrorsSuppressed = True
WebBrowser1.Navigate(Urls(counter))
counter = counter + 1
If counter > 3 Then myTimer.Stop()
End Sub