обработчик событий для управления событиями onpropertychange WebBrowser - объекты отправителя и e имеют значение null - PullRequest
2 голосов
/ 08 февраля 2012

В 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, используется только первое значение итерации, поэтому при вызове anonoMeth (string specificProperty) с каждым событием onpropertychange specificProperty имеет одинаковое значение, поскольку к соответствующему идентификатору был присоединен тот же самый elIDelement.

Я еще не пробовал методы расширения и хотел опубликовать это, чтобы увидеть, сталкивался ли кто-либо с подобными проблемами (и, надеюсь, найдет решение).Я предпочитаю не прибегать к C ++, если мне это абсолютно не нужно.

1 Ответ

4 голосов
/ 08 февраля 2012

Вам нужно привести ваш 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;
        }
    }
}
...