2012-03-21 74 views
3

我需要一些有關用戶單擊webBrowser控件中的超鏈接時發生的情況的信息。我的想法是,它稱爲.Navigate()方法,但我不確定。覆蓋webBrowser單擊事件

我已經創建了一個包裝方法,包裝導航方法。我想要做的是,當用戶點擊一個鏈接,或按鈕或watever,我的方法被調用,而不是.Navigate()方法。

我需要ovverride來實現這個目標?

感謝

編輯:似乎有一些很難理解我的問題,讓我嘗試refrase:

我已經創建了一個從web瀏覽器繼承了我自己的WebBrowser控件。在我的控制中,有一種方法用於在實際調用navigate()方法之前執行一些操作。

現在從我的代碼中調用這個方法很簡單,只需調用我的方法而不是.Navigate。但我想要的是,當用戶點擊頁面上的鏈接我的方法運行,而不是。導航。

回答

2

如果我理解正確,那麼你的方式就是錯誤的。

只需查看超鏈接的HTML代碼即可。 如果它是一個簡單的鏈接 - 那麼它只是去導航。 如果有一些腳本函數調用,那麼你可以看到函數做了什麼。

+0

因此,如果我重寫Navigate()所有鏈接點擊將通過我的方法? – TheGateKeeper 2012-03-21 12:07:44

+0

這遠遠接近我所說的任何事情。我只是建議檢查HTML代碼,以瞭解其背後的功能,因爲我明白你需要。 – SimpleVar 2012-03-21 12:09:42

+0

如果您實際上需要在用戶單擊它時運行一些代碼,那麼可以在初始化文檔(每次導航之後)後使用browser.Document.Click事件,並確定單擊的元素是否爲超鏈接,並運行你自己的代碼。 – SimpleVar 2012-03-21 12:17:21

0

嘗試做jQuery的通過

$('a').click(function(e){ 
    e.preventDefault(); 
    __doPostBack('functionForClick',''); 
}); 

雖然沒有嘗試這樣做。

5

無需重寫,只需將事件處理程序附加到WebBrowser.DocumentCompleted事件頁面上的每個鏈接即可。

private bool bCancel = false; 

private void webBrowser_DocumentCompleted(object sender, 
           WebBrowserDocumentCompletedEventArgs e) 
{ 
    int i; 
    for (i = 0; i < webBrowser.Document.Links.Count; i++) 
    { 
    webBrowser.Document.Links[i].Click += new  
          HtmlElementEventHandler(this.LinkClick); 
    } 
} 
private void LinkClick(object sender, System.EventArgs e) 
{ 
    bCancel = true; 
    MessageBox.Show("Link Was Clicked Navigation was Cancelled"); 
} 
private void webBrowser_Navingating(object sender, 
           WebBrowserNavigatingEventArgs e) 
{ 
    if (bCancel == true) 
    { 
    e.Cancel=true; 
    bCancel = false; 
    } 
} 

希望它有幫助!

編輯:

如果您想了解有關被點擊只需修改LinkClick事件處理程序是這樣的鏈接的詳細信息:

private void LinkClick(object sender, System.EventArgs e) 
{ 
    HtmlElement element = ((HtmlElement)sender); 
    string id = element.Id; 
    string href = element.GetAttribute("href"); 

    bCancel = true; 
    MessageBox.Show("Link Was Clicked Navigation was Cancelled");   
} 
+1

如何判斷哪個鏈接被點擊了?我想向用戶顯示幫助,但如果用戶單擊超鏈接,它將用真正的瀏覽器打開。 – Moonwalker 2013-02-05 13:34:08

+1

@Moonwalker我已經更新了我的答案。您可以通過將發件人轉換爲HtmlElement:((HtmlElement)發件人)來查找LinkClick事件處理程序中鏈接的所有信息。希望能幫助到你。 – Reinaldo 2013-02-05 14:08:09

+0

非常感謝!這幫了我很多。 – Moonwalker 2013-02-05 14:14:52

3

航行事件引發。您可以實施一個事件處理程序,以拒絕並重定向導航請求:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { 
     // Redirect expertsexchange to stackoverflow 
     if (e.Url.ToString().Contains("experts-exchange")) { 
      e.Cancel = true; 
      webBrowser1.Navigate("http://stackoverflow.com"); 
     } 
    } 
+0

因此,在此事件之後,WebBrowser會調用.Navigate方法的正常流程?我不希望發生這種情況,我希望它使用我自己的方法。 – TheGateKeeper 2012-03-21 12:56:22

+0

好吧,設置e.Cancel = true並自己調用Navigate()。這是不是很清楚你想要完成什麼。 – 2012-03-21 13:03:24

+0

我更新了主要問題。我不知道爲什麼很難理解,我想調用我自己的方法而不是。導航。這就是爲什麼我認爲最好只是重寫它。 – TheGateKeeper 2012-03-21 13:09:33

0

當鏈接定位到另一個窗口時,您正在全方位尋找事件。

假設鏈接有target =「_ new」,在這種情況下,導航事件永遠不會被觸發,因爲它是一個新的webBrowser,它實際上會打開url。