这可能为时已晚,但无论如何,如果您仍然想知道:
1 - HtmlElement div_result = webBrowser1.Document.GetElementById("div_result"); 第 1 行在网页加载完毕并且浏览器调用 DocumentCompleted 事件时执行。在事件处理程序中,您首先检索指向 DOM 元素“div_result”的指针,然后分配一个名为 div_result 的 HtmlElement 类型变量。
2 - div_result.AttachEventHandler("onpropertychange", new EventHandler(resultEventHandler)); 第 2 行 - 注册“onpropertychange”事件并将方法 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 中加载的数据的更多信息;例如,它来自哪里,它是什么类型,以及您能想到的任何其他相关信息。