Почему WebBrowser_DocumentCompleted () запускается дважды? - PullRequest
16 голосов
/ 24 февраля 2010

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

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

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

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

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

Ответы [ 9 ]

26 голосов
/ 09 марта 2010

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

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

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

17 голосов
/ 25 февраля 2010

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

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

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

  //The page is finished loading 
}
3 голосов
/ 25 октября 2013

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

  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
    }
3 голосов
/ 14 октября 2010

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

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

и если вы измените URL после звонка

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

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

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

3 голосов
/ 25 февраля 2010

Он срабатывает один раз за кадр.

1 голос
/ 13 марта 2013

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

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

0 голосов
/ 19 марта 2012

if (browser.ReadyState != WebBrowserReadyState.Complete) рекомендуется.

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

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

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

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

0 голосов
/ 10 марта 2010

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

0 голосов
/ 01 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...