在 C# 中,我在服务器端线程中运行 WebBrowser (WB) 控件,并希望监视(监听)“onpropertychange”事件。我可以成功附加一个在属性更改时执行的 .NET 委托(delegate)签名方法,但每次调用 qEventHndlr 时 sender 和 e 对象均为 null,因此,我不知道哪个属性发生了更改触发事件。 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++。
最佳答案
您需要在事件处理程序中将 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;
}
}
}
关于c# - WebBrowser 控件 onpropertychange 事件的事件处理程序 - sender 和 e 对象为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9184856/