2012-10-11 33 views
0

我在我的Web應用程序中使用WebBrowser控件。在DocumentCompleted事件上我想在我的字符串中使用DocumentText。我的DocumentCompleted事件就像下面。Web應用程序中的WebBrowser控件C#

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    string str = IEBrowser.DocumentText; 
} 

現在的問題是DocumentText,我想我不會在DocumentCompleted事件中得到它。我認爲有一些JavaScript可以在DocumentCompleted事件之後做些事情。所以我改變我的代碼就像這樣。

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    Thread th = new Thread(new ThreadStart(startthread)); 
    th.Start();    
} 

public void startthread() 
{ 
    //To Wait untill WebBrowser run that javascript 
    Thread.Sleep(5000); 
    string str = IEBrowser.DocumentText; 
} 

現在通過這段代碼,我得到了「指定的轉換無效」。 我該如何等待WebBrowser運行的線程?

+1

在web應用程序中使用web瀏覽控件?嘗試在Web應用程序內刮取一些東西?更好的方法是使用httpwebrequest,甚至是webclient。 – urlreader

回答

1

儘管我不認爲這是一個很好的方法,但一種方法是:不要在DocumentComplete中處理它。做這樣的事情:

  1. 做任何你需要做的...然後在一個點上,瀏覽器需要導航到一個URL,然後(您可能需要檢查語法,只需鍵入我的頭出來) :

      IEBrowser.Navigate(url); 
         bool flag = true; 
         int times = 0; 
         while (flag) 
         { 
          Sleep(500); 
          Application.DoEvent(); 
    
          if (IEBrowser.ReadyState == WebBrowserReadyState.Complete) 
          { 
           times ++; 
          } 
          else 
          { 
           times = 0; 
          } 
    
          if (times >= 10) 
          { 
           flag = false; 
          } 
         } 
    
         string str = IEBrowser.DocumentText; 
    

同樣,這只是一個變通,您可以嘗試。取決於你的目的,這可以提高很多。但是我使用了類似於這個程序的許多刮擦工作,並且它工作正常。取決於頁面,documentComplete可能會被多次觸發。

好運

+0

非常感謝,它工作正是我想要的。我現在創建了我的代碼。我需要完成我的代碼,所以需要一些額外的幫助。您將Sleep()放入您的代碼中。這與Thread.Sleep();相同。因爲如果它是Thread.Sleep()它將停止執行,所以我不包含它。 – Hiren

+0

我會把它放在TimeCallback中,這樣你仍然可以間隔檢查它,你仍然可以停止它,它不會殺死你的主線程... – emalamisura

0

我不太確定你在這裏做什麼,但我可以向你保證,踢掉那個線程並不是正確的解決方案。

試試這個,因爲IEBrowser_DocumentCompleted應該叫我的經驗幾次...

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {  
if (IEBrowser.ReadyState = WebBrowserReadyState.Complete)   
    { 
     //Do my stuff 
    } 
} 

不知道這是否會爲你工作,但我曾在過去的成功與它...

+0

你說得對,我試過這個,但它對我不起作用。我認爲JavaScript在ReadyState完成後運行。 – Hiren

+0

如果你想嘗試等待5秒鐘使用TimerCallback,但我不會依賴任何生產解決方案作爲它的不確定性。您還可以將腳本插入到頁面中,並且您可以使用它來確定您正在等待的Javascript是否已完成......以下是腳本注入的詳細信息,甚至可以從中獲取結果:http:/ /stackoverflow.com/questions/153748/how-to-inject-javascript-in-webbrowser-control – emalamisura

相關問題