2010-02-24 2 views
16

음, 간단한 웹 브라우저 컨트롤을 사용하여 페이지를 탐색하므로 양식의 텍스트를 변경해야합니다. 나는 -왜 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 .. 내가 .. 완전히로드

을 페이지가 완료 유일한 형태의 텍스트를 변경하려고 해요

치료 방법이 있습니까?

답변

25

이벤트가 발사 될 때 당신은 WebBrowser.ReadyState을 확인할 수 있습니다 readyState가 전체 문서가 준비되면 완료로 설정됩니다

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

.

+1

파일에서 외부 자바 스크립트 링크가 가장 많이 발생합니다. –

+0

작동하지 않습니다. – SerG

+0

그것도 나를 위해 작동하지 않습니다. 가양 성일 경우 –

3

프레임 당 한 번 발사됩니다.

17

프레임이로드 될 때마다 이벤트가 발생합니다.

또한 방문하기 전에 IsBusy 속성은 첫 번째 프레임이로드되지 않은 동안에 만 True이됩니다.

this을 시도해보십시오

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

    //The page is finished loading 
} 
+1

를이 블록은 전혀 발사하지 않습니다 .. –

+1

을 물어 두려워하지만, 당신이 이벤트까지 연결 했습니까? 결국 그것은 문서가 완성 된 것입니다. –

+0

Simply Brilliant. +1 – Barun

0

How To Determine When a Page Is Done Loading in WebBrowser Control DocumentCompleted가의 DocumentComplete의 에버트의 윈폼 '래퍼입니다, 당신은 이벤트를 발생하는 프레임 말할 수 있지만 WebBrowserDocumentCompletedEventArgs는 보낸 사람의 매개 변수를 숨 깁니다. 또는 WebBrowser.ReadyState을 확인할 수 있습니다.

0

사실, 항상 해고되는 것은 아닙니다. 왜 안 알아 냈어. 타이머가 있고 ReadyState를 몇 분 동안 반복해서 확인하십시오. (임베디드 브라우저 컨트롤 사용).

3

나는 같은 문제가 있는데, 이유는 기본적으로 컨트롤을 추가 할 때 이와 같은 디자이너 코드가 생성되기 때문입니다.

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

하고

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

를 호출 한 후 URL을 변경하는 경우는 두 개의 서로 다른 페이지로드 : 소개 : 빈NewUrl.com

그냥 디자이너 코드를 제거를 ... 그리고 당신은 "더블"이벤트를 중단 할 것입니다.

+0

나는 같은 문제에 부딪 쳤고이 해결 방법은 나에게 잘 돌아갔다. 나는 약간의 URL 속성이 어떻게 든 "대기"될 것 같습니다 : DocumentCompleted e.Url == "about : blank"로 트리거합니다 (URL = "http : // ... "선언 – Larry

0

if (browser.ReadyState != WebBrowserReadyState.Complete)을 권장합니다.

페이지에 프레임이 있으면 DocumentCompleted가 여러 번 해고됩니다. 그리고 해결하기가 어렵습니다. URL을 확인하는 것과 같은 방법은 정확하지 않습니다.이유를 사용하지 BTW

:

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

가 고정 접두사를 사용하려고 문제는 쉽게 해결 될 수 있습니다.

1

이 이벤트에 가입 할 때마다 URL을 탐색 할 때 어떤 방법 으로든이 이벤트를 여러 번 구독하게 될 수 있습니다.

이 문제를 해결하려면 해당 줄을 메서드 밖으로 이동하고 다른 인스턴스를 인스턴스마다 한 번만 호출해야합니다. 아마도 클래스의 생성자에서 ... 그건 당신의 문제를 해결해야합니다.

3

두 번 발사하는 것은 문제가 다음이 작업을해야하는 경우 :

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 
    } 
관련 문제