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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с html на форме, пара вопросов 
:(
    Опции темы
V0fka
Дата 21.6.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

Надо отображать html на форме. Для этого взял Webbrowser, поместил на форму. Т.к. текст хтмл берется извне, то вывожу его так:

Код

string html = Reader.getHtml();
Browser.Document.Write(html);


Это правильно или через "Ж"?

И ещё один вопрос. В хтмл-е есть ссылки. По нажатию на ссылку в этом же окне браузера открывается другая страница. А я хочу, чтобы по нажатию на ссылку новая страница открывалась в браузере по умолчанию, т.к. в данном случае Webbrowser использую только для того, что бы отобразить хтмл. Такое можно сделать?
PM MAIL   Вверх
diadiavova
Дата 21.6.2013, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  21.6.2013,  17:53 Найти цитируемый пост)
Это правильно или через "Ж"?

Поведение страницы при использовании разных способов загрузки может отличаться. Помимо указанного способа можно грузить страницу методом Navigate, если она существует в виде файла на компьютере или в сети. Если страница есть только в виде текста. То можно передать ее свойству DocumentText(при этом способе некоторые функции могут не работать). Или скажем можно воспользоваться свойством DocumentStream. 
При использовании метода Write, могут возникать неожиданные эффекты, например внезапно откроется браузер. Насколько я помню этот метод надо использовать совместно с OpenNew. 
Цитата(V0fka @  21.6.2013,  17:53 Найти цитируемый пост)
И ещё один вопрос. В хтмл-е есть ссылки. По нажатию на ссылку в этом же окне браузера открывается другая страница. А я хочу, чтобы по нажатию на ссылку новая страница открывалась в браузере по умолчанию, т.к. в данном случае Webbrowser использую только для того, что бы отобразить хтмл. Такое можно сделать? 

Ну можно, к примеру для ссылок установить атрибут target (хотя в этом случае открыться может ИЕ). Не очень элегантное решение, но заставить его худо-бедно работать таки можно. Можно прибегнуть и к более изощренным методам, например повесить на ссылки обработчики клика и выполнять открытие программно. В общем и целом, красивого решения у меня нет, но изловчиться можно. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 25.6.2013, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(diadiavova @  21.6.2013,  21:58 Найти цитируемый пост)
Поведение страницы при использовании разных способов загрузки может отличаться. Помимо указанного способа можно грузить страницу методом Navigate, если она существует в виде файла на компьютере или в сети.

Страницы физически нету.

Цитата(diadiavova @  21.6.2013,  21:58 Найти цитируемый пост)
Если страница есть только в виде текста. То можно передать ее свойству DocumentText(при этом способе некоторые функции могут не работать). Или скажем можно воспользоваться свойством DocumentStream. 

Поэкспериментирую, спасибо!

Цитата(diadiavova @  21.6.2013,  21:58 Найти цитируемый пост)
При использовании метода Write, могут возникать неожиданные эффекты, например внезапно откроется браузер. Насколько я помню этот метод надо использовать совместно с OpenNew. 

Почему я использую Write? Потому нашел только такой способ smile (не знал про DocumentText и DocumentStream). А что такое OpenNew - не понял (у браузера такого метода не обнаружил).

Цитата(diadiavova @  21.6.2013,  21:58 Найти цитируемый пост)
Ну можно, к примеру для ссылок установить атрибут target (хотя в этом случае открыться может ИЕ). Не очень элегантное решение, но заставить его худо-бедно работать таки можно.

Только что проверил, открывается ИЕ.

Цитата(diadiavova @  21.6.2013,  21:58 Найти цитируемый пост)
Можно прибегнуть и к более изощренным методам, например повесить на ссылки обработчики клика и выполнять открытие программно.

Это на джаваскрипт уже все делается? Или как-то можно обработчик клика по ссылке на C#-е подвесить и обработать?

У меня ещё был вопросик насчет отображения html. В общем, когда я начал искать информацию по работе с браузером, то почти везде используется метод Navigate. Но т.к. страницы физически нету и хтмл код генерируется на лету, то я искал способ в обход Navigate-а. Но я себе думал, что если такого не найду, то возможно, сделаю сохранение хтмл страницы где-то и потом её отображу через Navigate. Так вот вопрос: что лучше в моем случае, отображать хтмл код примерно как это делается сйечас, либо сгенерировать хтмл страничку, сохранить её где-то и отображать через Navigate>







PM MAIL   Вверх
diadiavova
Дата 25.6.2013, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  25.6.2013,  10:44 Найти цитируемый пост)
А что такое OpenNew - не понял (у браузера такого метода не обнаружил).

Метода Write у браузера тоже нет, но ты ведь нашел. Может там же поискать? smile
Цитата(V0fka @  25.6.2013,  10:44 Найти цитируемый пост)
Только что проверил, открывается ИЕ.

Ну это логично.
Цитата(V0fka @  25.6.2013,  10:44 Найти цитируемый пост)
Это на джаваскрипт уже все делается?

Вряд ли с яваскрипта получится запустить браузер по умолчанию. 
Цитата(V0fka @  25.6.2013,  10:44 Найти цитируемый пост)
Или как-то можно обработчик клика по ссылке на C#-е подвесить и обработать?

Проще всего так
http://msdn.microsoft.com/query/dev11.quer...r-.NETFramework
Правда докопаться до элемента-источника события без доступа к ком-объектам все равно не получится. Можно еще подключить mshtml для более полноценной работы с документом, а можно обойтись dynamic. В последнем случае, для получения адреса ссылки, по которой был выполнен клик вроде работает следующий код, написанный в обработчике
Код

dynamic window = webbrowser1.Document.Window.DomWindow
var href = window.event.srcElement.href
Соответственно придется после загрузки документа обойти все ссылки и привязать к ним обработчик. Вышеприведенным кодом в обработчике получишь адрес ссылки, а запускать браузер при помощи Process.Start

Цитата(V0fka @  25.6.2013,  10:44 Найти цитируемый пост)
 Так вот вопрос: что лучше в моем случае, отображать хтмл код примерно как это делается сйечас, либо сгенерировать хтмл страничку, сохранить её где-то и отображать через Navigate

Сохранение страницы во временный файл - вполне нормальная практика, такой подход используется, к примеру, локальной версие msdn(все просмотренные страницы ты можешь обнаружить в папке TEMP). При использовании Navigate страница ведет себя как в браузере, если использовать тот же DocumentText, то, насколько я помню, у тебя даже доступа к DOM не будет и ты все описанное выше будет недоступно. Хотя в случае с Write, по всей видимости, этой проблемы быть не должно( я не пользовался этим способом), тем не менее могут возникнуть другие проблемы, которые возникают при использовании mshtml, в частности, как я уже сказал, при записи некоторых страниц внезапно может открыться окно браузера или еще что-то в этом роде, хотя при использовании open, эта проблема вроде как решается, поэтому я и посоветовал Write без OpenNew не использовать, все-таки эти методы - не более чем оболочки соответствующих методов mshtml.HTMLDocument


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 25.6.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(diadiavova @  25.6.2013,  12:20 Найти цитируемый пост)
Метода Write у браузера тоже нет, но ты ведь нашел. Может там же поискать? 

Понял smile

Насчет всего остального цитировать отдельно не буду, опишу в общем. Раз сохранение и отображение файла - это нормальная практика, то я пока сделал именно так. В результате у меня даже получилось на ссылки навесить обработчики события. Но тут появились 2 проблемы:

1) Обработчики я навешиваю обходя коллекцию HTML элементов, полученных GetElementsByTagName("a"). Так вот, сразу после того, как отображается хтмл страница

Код

this.Browser.Navigate(tmp);


метод GetElementsByTagName("a") возвращает 0 элементов. Но если я его вызову сразу после этого, но по нажатию кнопки - все ок. Попробовал в событии DocumentCompleted, но там тоже возвращает 0 элементов. Где это все правильно сделать?

2) Как я написал выше, худо-бедно (по нажатию дополнительной кнопки) обработчики навешиваются. Сигнатура метода-обработчика такая: OnclickLink(object sender, EventArgs e). При нажатии на ссылку я попадаю в него, но в результате sender = null, а в e ничего нету, кроме члена Empty. Пробую, как ты пишешь выше

Код
dynamic window = webbrowser1.Document.Window.DomWindow
var href = window.event.srcElement.href


но студия ругается на свойство event "Требуется идентификатор, event является ключевым словом".

ПС. Я вот думаю, может все это делать не через html, а через ListBox? Можно ведь какие-то симпотичные ListBox-ы делать?
PM MAIL   Вверх
diadiavova
Дата 25.6.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  25.6.2013,  16:05 Найти цитируемый пост)
 Так вот, сразу после того, как отображается хтмл страница

Это надо делать в обработчике события DocumentCompleted. Желательно так же еще проверять свойство ReadyState.
Цитата(V0fka @  25.6.2013,  16:05 Найти цитируемый пост)
Попробовал в событии DocumentCompleted, но там тоже возвращает 0 элементов. Где это все правильно сделать?

Либо как уже сказал свойство проверь, либо можешь еще событие Navigated покурить.
Цитата(V0fka @  25.6.2013,  16:05 Найти цитируемый пост)
но студия ругается на свойство event "Требуется идентификатор, event является ключевым словом".

Тогда собачку поставь вначале слова. Это особенности шарповского компилятора.
Цитата(V0fka @  25.6.2013,  16:05 Найти цитируемый пост)
ПС. Я вот думаю, может все это делать не через html, а через ListBox? Можно ведь какие-то симпотичные ListBox-ы делать? 

Лучшим решением было бы использовать документы WPF, но если принципиально, чтобы приложение было именно винформовским, то листбоксы тут не особенно подходят, все-таки функционал у них слабенький. Хотя тоже от задачи зависит.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 25.6.2013, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(diadiavova @  25.6.2013,  15:13 Найти цитируемый пост)
Лучшим решением было бы использовать документы WPF, но если принципиально, чтобы приложение было именно винформовским

Да не, не принципиально. Не шарю просто, решил в windows forms. Но раз такое дело, буду пробовать на WPF что-то на###кодить smile . За ответы, как всегда, спасибо! smile 
PM MAIL   Вверх
diadiavova
Дата 25.6.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(V0fka @  25.6.2013,  16:20 Найти цитируемый пост)
 Не шарю просто, решил в windows forms. Но раз такое дело, буду пробовать на WPF что-то на###кодить

Эммм, ну там изучать придется все это дело. В принципе можно и в браузере разобраться.

Добавлено через 7 минут и 5 секунд
Кстати ничто не мешает в винформ-приложении захостить на форму какой-нибудь документвьюер из впф. Браузер - все-таки штука трудноконтролируемая, а объектная модель документа в впф - вещь достаточно простая и удобная. Короче говоря: выбор есть.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
V0fka
Дата 25.6.2013, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(diadiavova @  25.6.2013,  15:31 Найти цитируемый пост)
Эммм, ну там изучать придется все это дело. В принципе можно и в браузере разобраться.

Ну а шо делать? smile Поковыряю ВПФ, если не получится, вернусь к браузеру.

Цитата(diadiavova @  25.6.2013,  15:31 Найти цитируемый пост)
Кстати ничто не мешает в винформ-приложении захостить на форму какой-нибудь документвьюер из впф...

Та это ж шарить надо...
PM MAIL   Вверх
irinazanuda
Дата 29.6.2013, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поняла))) Не туда написала((

Это сообщение отредактировал(а) irinazanuda - 30.6.2013, 07:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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