2010-04-07 4 views
1

코드에서 프로그래밍 방식으로 WebBrowser 컨트롤을 만든 다음 페이지 내용을 읽으 려합니다.
디자이너와 똑같은 일을하고 있다고 생각하지만 동적으로 생성 된 컨트롤이 작동하지 않는다 (DocumentText에서 빈 문자열 반환)동적으로 생성 된 WebBrowser가 작동하지 않습니다.

내가 뭘 잘못하고있어?

편집 2 :

WebBrowser browser = new WebBrowser { Name = "myBrowser"}; 
browser.DocumentCompleted += browser_DocumentCompleted; 
browser.Navigate("www.google.com"); 
while (pageLoaded == false) 
{ 
    Thread.Sleep(500);  // pageLoaded is local field 
    Application.DoEvents(); // didn't wotk without this... 
} 
Console.WriteLine(browser.DocumentText); 

이벤트 처리기 코드 : (작업) @Axarydax 제안

홈페이지 블록 코드 후 코드 변화

void browser_DocumentCompleted (object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    pageLoaded = true; 
} 
+0

이제 브라우저가 DocumentCompleted 이벤트에 대해 알지 못하는 것을 잊었습니다. -> browser.DocumentCompleted + = new WebBrowserDocumentCompletedEventHandler (browser_DocumentCompleted)를 Main 메서드 – Axarydax

+0

에 추가했습니다.이 코드 라인을 붙여 넣는 것을 잊어 버렸습니다. 하지만 마침내 Application.DoEvents()를 추가하여이를 정렬했습니다. while 루프에서 명령. 나를 안내해 주셔서 감사합니다! – Maciej

답변

2

이동 방법은 비동기이기 때문에, NavigationComplete 이벤트가 발생하기를 기다려야합니다. 페이지의 HTML을 원한다면 System.Net.WebClient를 사용하십시오.

+0

당신의 제안에 따라 코드를 변경했습니다 - 여전히 나던 일 - 어떻게 고칠 수 있습니까? – Maciej

+0

고맙게도 고맙습니다.이 게시물에 대해, 그것은 저에게 많은 도움이되었습니다 !! – FosterZ

1

Navigate 메서드는 비동기 적으로 작동하므로 페이지가 백그라운드로로드되고 DocumentText 속성에 액세스 할 때 텍스트가 없습니다.

DocumentCompleted 이벤트에 처리기를 추가하고 거기에서 Console.WriteLine(browser.DocumentText) 통화를 옮기십시오.

+0

내 메인 프로그램 스레드에서 읽기 내용을 처리하기 위해 '대기'해야합니다. 내 예제에 편집 # 1을 추가하여 아카이브를 시도합니다. 어떻게 관리 할 생각입니까? – Maciej

+0

필요한 경우 Axarydax의 제안에 따라 페이지의 HTML 소스 만 있으면됩니다. –

1

이벤트가 발생하면 메시지를 보내야합니다. 메시지 디스패치 (예 : Application.DoEvents)가 부족한 while 루프로 메시지 펌프를 차단하면 작동하지 않습니다.

관련 문제