2012-08-01 88 views
3

以下是我用作我的瀏覽器的DocumentCompleted事件的功能,以及負責創建Web瀏覽器並導航到特定URL的navBtnClick()方法。WebBrowser文檔完成事件C#

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 

       MessageBox.Show(((WebBrowser)sender).Url.ToString()); 

} 



private void navBtnClick(object sender, EventArgs e) 
{ 
      WebBrowser wbrowser = new WebBrowser(); 
      wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); 
      wbrowser.Navigate("http://www.google.com"); 

} 

立即執行該線wbrowser.Navigate("http://www.google.com");後,存在正確地表示的URL的消息框,然後經過一段時間另一個消息框示出了具有相同的URL。所以,會發生什麼,無論是在事件處理程序中,都會執行兩次。有人可以幫助我只執行一次嗎?

回答

7

我記得,如果導航到的文檔有嵌入其他網頁的iframe,DocumentCompleted會多次觸發。

如果您只想接收事件恰好一次,從DocumentCompleted處理器只是退訂:

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    var webBrowser = sender as WebBrowser; 
    webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted; 
    MessageBox.Show(webBrowser.Url.ToString()); 
}  

private void navBtnClick(object sender, EventArgs e) 
{ 
    var wbrowser = new WebBrowser(); 
    wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); 
    wbrowser.Navigate("http://www.google.com"); 
} 

或者,你可以使用System.IObservable和ReactiveExtensions訂閱只有一個事件觸發:

private void navBtnClick(object sender, EventArgs e) 
{ 
    var browser = new WebBrowser(); 
    var docCompleted = Observable.FromEventPattern<WebBrowserDocumentCompletedEventArgs>(browser, "DocumentCompleted") 
    docCompleted 
     .Take(1) // Take only one event firing 
     .Subscribe(i => MessageBox.Show(browser.Url.ToString())); 

    browser.Navigate("http://www.google.com"); 
} 
+0

謝謝,非常有幫助 – cprogcr 2012-08-01 16:39:28

1

對我來說,http://www.google.com重定向到http://www.google.ca。如果您遇到類似情況,您可能會爲這兩份文件中的每一份都收到文件完成事件。嘗試輸出/跟蹤WebBrowserDocumentCompletedEventArgs.Url以查看完成的文檔。