Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Ajax данные в WebBrowser


Автор: Legionarius 8.8.2012, 14:42
Добрый день, уважаемые форумчане!
Ситуация следующая: в WebBrowser грузиться сайт (форма 2 селекта и кнопка), необходимо выбрать в 2-х select значения и нажать на ссылку. Причем данные во второй селект продгружаются через AJAX после выбора в первом селекте, и изначально в нем нету ни одного option.
Использую обработчик private void WebBrowser_DocumentCompleted.  В первом селекте выбираю нужный option (пробовал 2 методами)
Код

HtmlElement el_sel_1 = WebBrowser.Document.GetElementById("idselect1");
                el_sel_1.Children[0].SetAttribute("selected", "false");
                el_sel_1.Children[1].SetAttribute("selected", "true");
                
HtmlElement    sel1 = webBrowser1.Document.GetElementById("idselect1");
                var sel_e1 = (mshtml.HTMLSelectElementClass)sel1.DomElement;
                sel_e1.selectedIndex = 1;

Все отрабатывает в обоих случаях(выбор происходит). После чего на реакцию onchange должно было происходить отправка данных на через javascript, но автоматически оно не происходит. Я руками запускаю javascript
Код

WebBrowser.Document.InvokeScript("__doPostBack", args);

данные загружаются во второй селект (в WebBrowser они отображаются, можно выбирать руками). Я пытаюсь выбрать программно пункт во втором селекте, опять же 2 способами
Код

HtmlElement el_sel_2 = WebBrowser.Document.GetElementById("idselect2");
                el_sel_2.Children[0].SetAttribute("selected", "false");
                el_sel_2.Children[2].SetAttribute("selected", "true");
                
HtmlElement   sel2 = webBrowser1.Document.GetElementById("idselect2");
                var sel_e2 = (mshtml.HTMLSelectElementClass)sel2.DomElement;
                sel_e2.selectedIndex = 1;

 но в 1 случае вываливается такая ошибка:
Код

ArgumentOutOfRangeException was unhandled by used code            
Value of '0' is not valid for 'index'. 'index' should be between 0 and -1.
Parameter name: index

а во втором вообще ничего не происходит. Я так понимаю, что о Children никакой информации нет, так как option-ов во втором селекте изначально вообще нету.
 Как произвести выбор во втором селекте? Как обрабатывать данные возвращаемые через AJAX? Подскажите пожалуйста!
Потом решил на форму дабавить кнопку и на button1_Click повесил
Код

HtmlElement   sel2 = webBrowser1.Document.GetElementById("idselect2");
                var sel_e2 = (mshtml.HTMLSelectElementClass)sel2.DomElement;
                sel_e2.selectedIndex = 1;

и если после того как отработал WebBrowser_DocumentCompleted нажать на кнопку, выбор во втором select происходит!!!, т.е. какая-то проблема с обновлением данных в WebBrowser, на сколько я понял. Нашел в теме http://forum.vingrad.ru/topic-298077.html (у меня на машине работает) код и решил использовать.  В WebBrowser_DocumentCompleted после запуска javascript вставил
Код

var _div1 = (mshtml.HTMLSelectElementClass)sel2.DomElement;
_div1.HTMLSelectElementEvents2_Event_onpropertychange += new mshtml.HTMLSelectElementEvents2_onpropertychangeEventHandler(_div1_HTMLSelectElementEvents2_Event_onpropertychange);

а в теле 
Код

void _div1_HTMLSelectElementEvents2_Event_onpropertychange(mshtml.IHTMLEventObj pEvtObj)
        {
            if (((mshtml.IHTMLEventObj2)(pEvtObj)).propertyName == "innerHTML")
            {
                MessageBox.Show(sel2.InnerHtml);
            }
        }
        
но ничего не происходит, может у кого есть мысли как победить проблему?


Код

 mshtml.HTMLElementEvents2_Event _div1 = (mshtml.HTMLElementEvents2_Event)(sel2.DomElement);
 _div1.onpropertychange += new mshtml.HTMLElementEvents2_onpropertychangeEventHandler(_div1_onpropertychange);
     

 void _div1_onpropertychange(mshtml.IHTMLEventObj pEvtObj)
        {
            mshtml.IHTMLEventObj2 evtobj2 = (mshtml.IHTMLEventObj2)pEvtObj;
            string propname = evtobj2.propertyName;
            if (propname == "innerHTML")
            {
                MessageBox.Show(sel2.InnerHtml);
            }
        }

так тоже без реакции, просто ничего не происходит

Автор: diadiavova 8.8.2012, 23:12
Legionarius, 
Цитата(Legionarius @  8.8.2012,  15:42 Найти цитируемый пост)
Я так понимаю, что о Children никакой информации нет, так как option-ов во втором селекте изначально вообще нету.

Так и есть
Цитата(Legionarius @  8.8.2012,  15:42 Найти цитируемый пост)
и если после того как отработал WebBrowser_DocumentCompleted нажать на кнопку, выбор во втором select происходит!!!, т.е. какая-то проблема с обновлением данных в WebBrowser, на сколько я понял.

Никакой проблемы: если ты изменяешь документ программно событие DocumentCompleted не происходит.
Цитата(Legionarius @  8.8.2012,  15:42 Найти цитируемый пост)
Как обрабатывать данные возвращаемые через AJAX? Подскажите пожалуйста!

Сам объект хмлхттпреквест имеет событие окончания загрузки данных и в принципе можно с ним попробовать поколдовать, но лучше все-таки отслеживать изменение интересующего элемента, как ты и сделал.
Цитата(Legionarius @  8.8.2012,  15:42 Найти цитируемый пост)
но ничего не происходит, может у кого есть мысли как победить проблему?

Честно говоря, не имея проекта в руках, сказать в чем проблема довольно трудно. Например, если ты работаешь с 4-м фреймворком, то там при линке ком-сборок нужные интерфейсы просто внедряются в твою сборку(это действие по умолчанию), так вот при внедрении иногда приведение объекта к нужному интерфейсному типу может оказаться неудачным, хотя при работе со сборкой взаимодействия тот же самый исходный тип свободно приводится к тому же интерфейсу. В твоем случае неудачным могло быть приведение дом-объекта к типу интерфейса событий например( хотя скорей всего в этом случае ты получил бы сообщение об ошибке во время отладки). 
Короче говоря, не имея в руках проекта, диагностировать проблему вряд ли получится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)