C# WebBrowser控件onpropertychange事件的事件处理程序-发件人和e对象为空

C# WebBrowser控件onpropertychange事件的事件处理程序-发件人和e对象为空,c#,asp.net,event-handling,webbrowser-control,anonymous-methods,C#,Asp.net,Event Handling,Webbrowser Control,Anonymous Methods,在C#中,我在服务器端线程中运行WebBrowser(WB)控件,并希望监视(侦听)“onpropertychange”事件。我可以成功附加一个.NET委托签名方法,该方法在属性更改时执行,但在每次调用qEventHndlr时,发送方和e对象都为null,因此,我不知道更改了哪个属性以触发事件。el是一个HtmleElement,在foreach循环中迭代,以将eventhandler附加到要监视(侦听)的每个元素 文档表明EventArgs类;此类不包含事件数据;在引发事件时,不将状态信息传递

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

文档表明EventArgs类;此类不包含事件数据;在引发事件时,不将状态信息传递给事件处理程序的事件使用此类。如果事件处理程序需要状态信息,应用程序必须从此类派生一个类来保存数据 看起来(我不确定,也没有测试)发送方只为WB事件的一个子集填充,而不是onpropertychange

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

el.AttachEventHandler("onpropertychange", delegate(Object sender, EventArgs e) { anonoMeth(elID); });
public void anonoMeth(string specificProperty) {..}
但是,编译器接受该语法,即使在foreach循环中elID字符串发生更改,也只使用第一个迭代值,以便在每个onpropertychange事件调用anonmeth(string specificProperty)时,specificProperty具有相同的值,因为相同的elID附加到相应的元素


我还没有尝试过扩展方法,我想发布这篇文章,看看是否有人遇到过类似的挑战(希望有一个解决方案)。我不喜欢诉诸C++,除非我必须这样做。

你需要把你的<代码>发件人<代码>在你的事件处理程序中,把一个适当类型的对象(一个代码< HTMLMelEng/<代码>)提交到

请在上尝试此示例以了解大小:

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;
        }
    }
}

您需要将
发送方
强制转换为事件处理程序中适当类型的对象(在您的情况下为
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#”之类的前缀。这就是标签的作用。请不要在标题前加上“C#”之类的前缀。这就是标签的用途。谢谢LiquidPony的指导。在查看了您的代码之后,我意识到我不需要将项目的这一部分实现为webform,并将其更改为windows窗体(正如您所做的那样)。我稍微修改了您的代码,以获取元素中感兴趣的属性,并能够将正确的字符串作为对象传递给“testEventHandler”。由于没有在方法参数中设置正确的值,因此获取的发送方对象为空。你的代码让我想到了一些我以前从未考虑过的不同解决方案。再次谢谢。很高兴为您服务!如果您觉得合适,请投票选出答案或将其标记为已接受,以便其他人可以将该解决方案视为有用的资源。感谢LiquidPony的指导。在查看了您的代码之后,我意识到我不需要将项目的这一部分实现为webform,并将其更改为windows窗体(正如您所做的那样)。我稍微修改了您的代码,以获取元素中感兴趣的属性,并能够将正确的字符串作为对象传递给“testEventHandler”。由于没有在方法参数中设置正确的值,因此获取的发送方对象为空。你的代码让我想到了一些我以前从未考虑过的不同解决方案。再次谢谢。很高兴为您服务!如果您觉得合适,请投票支持答案或将其标记为已接受,以便其他人可以将该解决方案视为有用的资源。