在 C# 中,我在服务器端线程中运行 WebBrowser (WB) 控件,并希望监视(侦听)“onpropertychange”事件。我可以成功附加一个在属性更改时执行的 .NET 委托签名方法,但是sender 和 e 对象均为 null因此,在每次调用 qEventHndlr 时,我不知道更改哪个属性来触发事件。 el 是一个 HTMLElement,它在 foreach 循环中迭代,以将事件处理程序附加到每个要监视(侦听)的元素。
el.AttachEventHandler("onpropertychange", qEventHndlr); // in the foreach loop
public void qEventHndlr(Object sender, EventArgs e) {…} // the event handler
文档表明EventArgs类; “此类不包含事件数据;引发事件时不将状态信息传递给事件处理程序的事件使用它。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据”。
似乎(我不确定也没有测试过)发件人仅填充了 WB 事件的子集,而不是 onpropertychange。
因此,我随后想到,如果无法在 send 或 e 对象中获取标识符信息,我可以在 AttachEventHandler 中使用匿名方法,然后将唯一的运行时可编程字符串参数传递给嵌入在事件处理程序方法调用中的方法。
el.AttachEventHandler("onpropertychange", delegate(Object sender, EventArgs e) { anonoMeth(elID); });
public void anonoMeth(string specificProperty) {..}
然而,编译器接受了该语法,即使 elID 字符串在 foreach 循环中发生更改,也仅使用第一个迭代值,因此当每个 onpropertychange 事件调用 anonoMeth(string SpecificProperty) 时,specicProperty 具有相同的值,因为相同的 elID被附加到相应的元素。
我还没有尝试过扩展方法,想发布这篇文章来看看是否有人遇到过类似的挑战(希望有解决方案)。除非绝对必要,否则我宁愿不诉诸 C++。