2012-03-21 75 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。