Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax данные в WebBrowser, не могу обратиться к select в WebBrowser 
:(
    Опции темы
Legionarius
Дата 8.8.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.8.2012

Репутация: нет
Всего: нет



Добрый день, уважаемые форумчане!
Ситуация следующая: в 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);
            }
        }

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

Это сообщение отредактировал(а) Legionarius - 8.8.2012, 15:17
PM MAIL   Вверх
diadiavova
Дата 8.8.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



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-м фреймворком, то там при линке ком-сборок нужные интерфейсы просто внедряются в твою сборку(это действие по умолчанию), так вот при внедрении иногда приведение объекта к нужному интерфейсному типу может оказаться неудачным, хотя при работе со сборкой взаимодействия тот же самый исходный тип свободно приводится к тому же интерфейсу. В твоем случае неудачным могло быть приведение дом-объекта к типу интерфейса событий например( хотя скорей всего в этом случае ты получил бы сообщение об ошибке во время отладки). 
Короче говоря, не имея в руках проекта, диагностировать проблему вряд ли получится.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.