WebBrowser控制属性更改事件的事件处理程序-sender和e对象为null

本文关键字:-sender 对象 null 程序 事件处理 属性 控制 事件 WebBrowser | 更新日期: 2023-09-27 18:23:35

在C#中,我正在服务器端线程中运行WebBrowser(WB)控件,并希望监视(侦听)"onpropertychange"事件。我可以成功附加一个.NET委托签名方法,该方法在属性更改时执行,但sender和e对象在每次调用qEventHndlr时都为null,因此,我不知道更改了哪个属性来激发事件。el是一个HTMLElement,它在foreach循环中迭代,将事件处理程序附加到要监视(侦听)的每个元素。

el.AttachEventHandler("onpropertychange", qEventHndlr);     // in the foreach loop
public void qEventHndlr(Object sender, EventArgs e) {…}     // the event handler

文档指出EventArgs类;此类不包含事件数据;当引发事件时,不将状态信息传递给事件处理程序的事件会使用此类。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据似乎(我不确定,也没有测试)发送方只为WB事件的子集填充,而不是针对属性更改。

因此,我想,如果我不能在send或e对象中获得标识符信息,我可以在AttachEventHandler中使用一个匿名方法,然后将一个唯一的运行时可编程字符串参数传递给嵌入事件处理程序方法调用中的方法。

el.AttachEventHandler("onpropertychange", delegate(Object sender, EventArgs e) { anonoMeth(elID); });
public void anonoMeth(string specificProperty) {..}

然而,编译器接受了语法,即使elID字符串在foreach循环中发生了变化,也只使用第一个迭代值,因此当对每个onpropertychange事件调用anoMeth(字符串特定属性)时,特定属性具有相同的值,因为相同的elID附加到了相应的元素。

我还没有尝试过扩展方法,我想把它发布出来,看看是否有人遇到过类似的挑战(希望有一个解决方案)。除非万不得已,否则我宁愿不使用C++。

WebBrowser控制属性更改事件的事件处理程序-sender和e对象为null

您需要将sender强制转换为事件处理程序中适当类型的对象(在您的情况下是HTMLElement)。

试试这个例子的大小:

namespace WebBrowserEventTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowserTest.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowserTest_DocumentCompleted);
            webBrowserTest.Navigate("http://mondotees.com");
        }
        private void webBrowserTest_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            foreach(HtmlElement el in webBrowserTest.Document.GetElementsByTagName("div"))
            {
                el.AttachEventHandler("onpropertychange", delegate { testEventHandler(el, EventArgs.Empty); });
            }
            foreach (HtmlElement el in webBrowserTest.Document.GetElementsByTagName("div"))
            {
                el.Name = "test";
            }
        }
        public void testEventHandler(object sender, EventArgs e)
        {
            var he = (HtmlElement)sender;
        }
    }
}