WebBrowser OnPropertyChange事件未触发

时间:2012-12-23 22:51:40

标签: c# html winforms webbrowser-control propertychanged

我有一个网页,上面有一个输入按钮。单击此按钮,在特定div中加载一些数据。我的问题是我无法抓住这些数据。

以下代码是我尝试解决此问题,但没有成功。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElement div_result = webBrowser1.Document.GetElementById("div_result");
    div_result.AttachEventHandler("onpropertychange", new EventHandler(resultEventHandler));
}
private void resultEventHandler(object sender, EventArgs e)
{
    MessageBox.Show("Loaded");
}

如果我点击输入按钮,会修改div的内容,但resultEventHandler不会触发。

所以,我有两个问题:

  1. 这段代码中我的错在哪里?
  2. 是否有“正常方式”(我的意思是不使用计时器或Aplication.DoEvents())在C#中使用WebBrowser控件使用ajax?

3 个答案:

答案 0 :(得分:0)

更改子元素的innerText或innerHTML不会导致为父元素触发onpropertychange事件。

答案 1 :(得分:0)

我无法分辨为什么HtmlElement事件不适合你。但我有同样的问题,并通过使用COM包装器来解决它:

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)webBrowser1.Document.DomDocument;
mshtml.IHTMLElement2 div_result = (mshtml.IHTMLElement2)doc.getElementById("div_result");
mshtml.HTMLElementEvents2_Event events = (mshtml.HTMLElementEvents2_Event)div_result;
events.onpropertychange += resultEventHandler;

答案 2 :(得分:0)

这可能为时已晚,但无论如何你仍然想知道:

1 - HtmlElement div_result = webBrowser1.Document.GetElementById(" div_result"); 当网页加载并且浏览器调用了DocumentCompleted事件时,将执行第1行。在事件处理程序中,您首先检索指向DOM元素的指针" div_result"并指定一个名为div_result的HtmlElement类型变量。

2 - div_result.AttachEventHandler(" onpropertychange",new EventHandler(resultEventHandler)); 第2行 - 注册" onpropertychange" event并将方法resultEventHandler指定为侦听器方法。

每次点击网页上的按钮时,按钮(我假设)都会以提交的形式提交,导致网页加载;顺便说一下,当您点击按钮(获取或发布)时,您没有指定使用哪种帖子方法。当网页下载完成并构建DOM元素树时,将调用DocumentCompleted事件。您的DocumentCompleted事件处理程序方法执行了上述指令。

每次单击按钮时,都会重新加载网页,并为onpropertychange事件重新分配事件侦听器。您只是分配事件监听器。该活动永远不会被召唤。每次单击按钮时都会定义它。你有一个经典的第一个鸡,或鸡蛋问题。但在你的情况下,你的鸡是按钮点击事件导致DocumentCompleted方法运行,它重置方法中所有变量的状态,你的鸡蛋想要一个指向DIV元素的onpropertychange事件的指针,然后按钮是点击了网页。如何从一个尚未构造的DOM中获取指针之前,如何为htmlelement分配一个事件监听器?将布尔标志变量放在包含DocumentCompleted方法的类中并设置其初始状态。将div_result变量移动到DocumentCompleted方法之外以增加其范围并在按钮单击事件中保存其状态。这样,您将获得指向div元素的指针,并在第一次下载网页时设置其onpropertychange事件侦听器。如果您只想设置一个指向DIV元素的onpropertychange事件监听器的指针(我在下面的示例代码中放置一个),并且下次单击按钮时,您的事件将会触发,请添加测试。注意!在存储指向任何网页元素或其事件的指针后,请确保不要添加或删除网页中的任何元素。否则,您将不得不重新解析DOM以获取指向DOM树中元素的新位置的指针。

//见下文:

class SomeClass
{
    bool DocumentHasLoaded = false;
    HtmlElement div_result = null;

    //Constructor and other methods go here....

    //Then change your DocumentCompleted method to look like this:
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

        if (DocumentHasLoaded == false)  // I prefer using a ! before the variable instead
        {
            DocumentHasLoaded = true;    // You will have to create your own appropriately timed mechanism to reset this variable's state should you want to execute the whole process again.
            div_result = webBrowser1.Document.GetElementById("div_result");
            div_result.AttachEventHandler("onpropertychange", new EventHandler(resultEventHandler));
        }
    }
}

为了回答您的第二个问题,我需要有关DIV中加载的数据的更多信息;例如它来自哪里以及它是什么类型以及您能想到的任何其他相关信息。