2016-07-09 1 views
0

Я пытаюсь создать «ротатор» в форме, которая циклически проходит через ряд URL-адресов и отображает URL-адрес в элементе управления WebBrowser. Следующий код отображает мою форму, но форма остается белой/пустой, а затем через некоторое время появляется последний url в массиве. Когда я помещаю MessageBox между каждым URL-адресом, чтобы создать остановку, он работает, и каждый URL-адрес появляется. Я пробовал поставить Sleep вместо MessageBox, но это не сработало. Я также пытался увеличить время Sleep, но это тоже не сработало. Как я могу заставить его работать правильно?Открывать несколько URL-адресов последовательно в элементе управления WebBrowser в VB.NET

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

Вы можете позвонить Application.DoEvents после изменения URL, так что управление получает возможность перекроить себя.
Однако лучше всего использовать timer, который срабатывает каждые 2 секунды, а затем изменяет URL-адрес в обработчике событий, чтобы ваш пользовательский интерфейс сохранял отзывчивость.
Например, настройте новое поле 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 
+0

Спасибо. Первый подход, который вы предложили, работает, если я не пытаюсь открыть URL-адрес. Например, если я заменил «Form3.WebBrowser1.Navigate (Urls (counter))» с «Label1.Text = Urls (counter)», метка изменится, как ожидалось. Однако для «Навигация» он отображает только последний URL-адрес. Также вы могли бы привести пример своего второго предложения? – user3080392

+0

Обновлен мой ответ. Надеюсь, это поможет. – DAXaholic

+0

Ваше решение сработало. Благодаря! Я сделал некоторые небольшие корректировки и отправил свой ответ. – user3080392

Смежные вопросы