Подтвердить что ты не робот

Почему дважды запускается WebBrowser_DocumentCompleted()?

Ну, я использую простой элемент управления веб-браузером для перехода на страницу, поэтому мне нужно изменить текст формы во время этого. Я использую -

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     this.Text += " - " + webBrowser1.Document.Domain;
}

но используя точку останова, я заметил, что это событие срабатывает дважды. Я даже попробовал событие _Navigated(). он также выстрелил дважды. Вызов заголовка "Webber - google.co.in - google.co.in"..

Я также заметил, что это событие срабатывало несколько раз при загрузке msn.com. Я пытаюсь изменить текст формы только тогда, когда страница полностью загрузилась.

Любое средство?

4b9b3361

Ответ 1

Вы можете проверить WebBrowser.ReadyState при запуске события:

if (browser.ReadyState != WebBrowserReadyState.Complete)
    return;

ReadyState будет установлен для завершения, как только весь документ будет готов.

Ответ 2

Каждый раз при загрузке кадра происходит событие.

Кроме того, еще до того, как вы перейдете туда, свойство IsBusy будет иметь значение True, пока первый кадр не загружен.

void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 

  //The page is finished loading 
}

Ответ 3

Он запускается один раз за кадр.

Ответ 4

У меня та же проблема, и причина в том, что по умолчанию, когда вы добавляете элемент управления, он генерирует такой код дизайнера.

this.webBrowser1.Url =  new System.Uri("", System.UriKind.Relative);

и если вы измените URL-адрес после вызова

InitializeComponent();
WebBrowser.Navigate("NewUrl.com");

Он загрузит две разные страницы: О: Пустое и NewUrl.com

Просто удалите код дизайнера... и вы остановите "двойное" событие.

Ответ 5

Если стрельба дважды является проблемой, тогда это должно работать:

  string body="";

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (body == webBrowser1.Document.Body.InnerHtml) return;
        body = webBrowser1.Document.Body.InnerHtml;

        // Here is something you want
    }

Ответ 6

Возможно, вы подписали это событие несколько раз, как в своем некотором методе, когда вы переходите на URL-адрес при каждом подписании этого события.

Чтобы решить эту проблему, переместите эту строку из метода и поместите ее где-то в другом месте, где она будет вызываться только один раз за экземпляр. Возможно, в конструкторе класса... Это должно решить вашу проблему.

Ответ 7

Как определить, когда страница будет выполнена Загрузка в WebBrowser Control DocumentCompleted - это оболочка WinForms для evert DocumentComplete, однако WebBrowserDocumentCompletedEventArgs скрывает параметр отправителя, поэтому вы не можете определить, какой фрейм поднимает событие. В качестве альтернативы вы можете проверить WebBrowser.ReadyState.

Ответ 8

Собственно, это не всегда срабатывает. Не понял, почему нет. У меня есть таймер и несколько раз проверяйте ReadyState несколько минут. (Использование встроенного управления браузером).

Ответ 9

if (browser.ReadyState != WebBrowserReadyState.Complete).

И когда на странице есть кадры, DocumentCompleted будет запущен несколько раз. И это трудно решить. Некоторые способы, как проверка URL-адресов, неточны.

Кстати, почему бы не использовать это:

this.Text = stringA + " - " + webBrowser1.Document.Domain;

Попробуйте использовать фиксированный префикс, проблема может быть решена легко.