mas*_*san 3 .net c# event-handling webbrowser-control
我使用的是Visual C#Express 2010(.NET Framework 4.0),Windows 7 32位.
我创建了WinForm项目,它只有WebBrowser控件和ListItem对象,通过onclick事件显示html信息.
我的目标是运行项目并单击webbrowser控件中的网站中的文本字段,并显示已单击的html文档信息(例如文本字段标记等)
码
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private mshtml.HTMLDocument doc = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
object oUrl = "http://livemocha.com/";
object oEmpty = "";
myBrowser.Navigate(oUrl.ToString());
}
private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
try
{
doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument;
mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;
iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
}
catch (UnauthorizedAccessException err)
{
Console.WriteLine("OOPS: " + err);
}
}
//event handler when user clicks mouse
//and just display info such as html tag and its attributes
private bool ClickEventHandler(mshtml.IHTMLEventObj e)
{
actionList.Items.Add("------- ClickEventHandler -----------");
actionList.Items.Add(e.type + " : " + e.srcElement.tagName + " : " + e.srcElement.outerHTML + " : " + e.srcElement.innerText + " : " + e.srcElement.id);
return true;
}
}//end class
}//end namespace
Run Code Online (Sandbox Code Playgroud)
问题是当它工作时,ListItem对象显示由ClickEventHandler生成的相同输出.例如,如果我访问www.google.com并只需鼠标点击搜索文本字段,输出结果为:
----- ClickEventHandler ---------
click: INPUT <INPUT style=.....
----- ClickEventHandler ---------
click: INPUT <INPUT style=.....
----- ClickEventHandler ---------
click: INPUT <INPUT style=.....
Run Code Online (Sandbox Code Playgroud)
等等.点击事件会多次触发.
我按照这里的例子:http: //support.microsoft.com/kb/312777
我以为myBrowser_DocumentCompleted()被多次调用并在行中添加相同的事件处理程序,
iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
Run Code Online (Sandbox Code Playgroud)
但像onclick()这样的HTMLDocumentEvents2_Event方法只接受+ =或- =所以我无法真正改变这一行.
有没有遇到过这个?
UPDATE
认为webbrowser控件URL最初设置为www.msn.com,当项目运行时,会调用documentCompleted事件一次,添加click事件处理程序.
然后导航到另一个添加了单击事件处理程序的URL的FormLoad()事件.
所以现在存在2个单击事件处理程序.
另外,每次我转到不同的URL时,都会添加点击事件处理程序.
所以我很清楚documentCompleted() event,iEvent没有被正确清除.(通过查看代码,它是根据documentCompleted()事件初始化的,所以它不应该有这种行为,但...)
花了一些时间后,我想到每次重新加载页面而不管是哪个URL,都会触发documentCompleted()事件,同时将clickEvent()添加到iEvent.
解决方法是检查doc是否为null.
private void myBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
try
{
if (doc == null)
{
doc = (mshtml.HTMLDocument)myBrowser.Document.DomDocument;
mshtml.HTMLDocumentEvents2_Event iEvent = (mshtml.HTMLDocumentEvents2_Event)doc;
iEvent.onclick += new HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
iEvent.onkeypress += new HTMLDocumentEvents2_onkeypressEventHandler(KeyStrokeEventHandler);
}
}
catch (UnauthorizedAccessException err)
{
Console.WriteLine("OOPS: " + err);
}
}
Run Code Online (Sandbox Code Playgroud)
我不相信这是最好的解决方案,但现在这个有效.(虽然仍然不确定为什么它添加clickEvent即使iEvent每次documentCompleted()调用重新初始化.
| 归档时间: |
|
| 查看次数: |
4034 次 |
| 最近记录: |