webBrowser1.Document.Write("Some text<br><button name='go'>GO</button>");
webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
void func(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
можно ли поместить внутри текста кнопку с вызовом процедуры C#
пользуюсь VS 2008, C#
у меня такая задача - создание специфичного словаря. В текстовом файле выполняется поиск нужных слов. определяются строки где есть эти слова.
затем результат преобразуется в html путем добавления разных тегов. результат выводится в окно WinBrowser.
по сути бровзер красиво отображает строки, хранящиеся в блокноте.
я бы хотел, чтобы после каждой строки (длинная строка блокнота выглядит как целый абзац в броузере моего приложения). я бы хотел , чтобы каждая строка заканчивалась парой кнопок , которые бы листали словарь, отображая соседние строки.
ВОПРОС: можно ли в текст вкрапить кнопки, которые бы вызывали процедуры моего приложения? аналог гиперссылки, которая при нажатии не идет по адресу - а вызывает процедуру, передавая туда параметры.
подробнее задумка выглядит так.
ищется ПоисковоеСлово. Оно обнаружено в строке 115, 300, 554. в окне броузера выводится:
всего найдено 3 вхождения:
Строка 115:
текст строки 115 из блакнота в виде html
(<<)-перейти к строке 114; (>>) - перейти к строке 116 - (при нажатии выполнить процедуру, заменяющий текст строки 115 в блоке, на 114, или 116)
Строка 300:
текст строки 300 из блакнота в виде html
(<<)(>>)
Строка 554:
текст строки 554 из блакнота в виде html
(<<)(>>)
Что-то вроде:
Код:
единственное - когда вставляю команду webBrowser1.Refresh();
то при нажатии GO функция func не вызывается.
вот как у меня (тег кнопки прописан в строке browsText) .
Код:
webBrowser1.Document.Write(browsText);
webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
webBrowser1.Refresh();
webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
webBrowser1.Refresh();
не знаю как быть.
если убрать webBrowser1.Refresh(); - тогда функция вызывается, но зато окошко броузера не обновляется :(
Для этого создаём обработчик завершения загрузки документа и в нём пишем нужный код.
Код:
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
}
{
webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
}
Обработчик евента нужно подключить:
Код:
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
Там, где документ рефрешится, ничего лишнего:
Код:
webBrowser1.Document.Write(browsText);
webBrowser1.Refresh();
webBrowser1.Refresh();
но после первого же рефреша - перестает работать.
вы привели 3 отрывка кода. средний (№2) я не понял куда вставить. но подумал - что если я через свойства элемента webBrowser1 -> Properties -> Events добавил обработчик - (код №1) - то подумал может №2 не надо писать?
и еще когда кнопка работает при первом запуске - работает только первая. а на странице много таких же кнопок. Мне наверное надо их создавать с разными именами да? да и к тому же мне ведь в каждую кнопку надо наверное номер строки передать, чтобы потом переключение правильно происходило?
затем при AttachEventHandler обхожу все эти кнопки. и на всем множестве срабатывает процедура func.
но, теперь встал другой вопрос! - как в func передать , например название кнопки? или любую другую переменную? в документации, что я нашел, везде обработчики событий описываются без возможности передавать туда посторонние данные.
допустим у меня срабатывает такое событие:
Код:
webBrowser1.Document.All["go239"].AttachEventHandler("onclick", new EventHandler(func));
как мне в func передать 239 (или go239). или вообще что нибудь?
подскажите пожалуйста. у самого никак не получается. хотя я честно стараюсь
Цитата: rustamh
если я через свойства элемента webBrowser1 -> Properties -> Events добавил обработчик - (код №1) - то подумал может №2 не надо писать?
Совершенно верно, вы правильно сообразили, что если подключить обработчик события через свойство компонента, то вручную ничего писать уже не надо (код будет сгенерирован средой автоматически, и будет находиться в файле Form*.Designer.cs).
Цитата: rustamh
как мне в func передать 239 (или go239). или вообще что нибудь?
Чтобы передать значение в метод C# поступаем так. Вместо имён кнопок (как я в прошлый раз посоветовал) задаём кнопкам id (каждой кнопке свой). На каждую кнопку вешаем обработчик клика следующим образом:
Код:
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// это вместо способа с AttachEventHandler
webBrowser1.Document.GetElementById("go1").Click += func;
// вешаем на каждую кнопочку по её id
}
void func(object sender, EventArgs e)
{
// приводим объект sender к типу HtmlElement, например, так
HtmlElement elem = (HtmlElement)sender;
// теперь можно из свойств elem получить нужную нам информацию
MessageBox.Show(elem.Id);
}
{
// это вместо способа с AttachEventHandler
webBrowser1.Document.GetElementById("go1").Click += func;
// вешаем на каждую кнопочку по её id
}
void func(object sender, EventArgs e)
{
// приводим объект sender к типу HtmlElement, например, так
HtmlElement elem = (HtmlElement)sender;
// теперь можно из свойств elem получить нужную нам информацию
MessageBox.Show(elem.Id);
}
Когда вешаешь обработчик события по имени и через AttachEventHandler, то sender всегда почему-то null.
Ну вот, теперь я и сам разобрался, как это делается :).
Цитата: rustamh
я честно стараюсь
:) Охотно верю, это заметно.
мне уже неудобно докучать вам вопросами.
но никак не получается самому разобраться.
после первой загрузке текста все кнопки работают.
стоит обновить броузер - (запустить процедуру, которая заново формирует текст html , в конце которой находится рефреш) - кнопки отображаются, но при нажатии на них ничего не происходит.
я это добавление кнопок везде пытался протыкать. но так ничего не выходит.
просто событие webBrowser1_DocumentCompleted срабатывает только при изначальном составление текста броузера. а после изменений дальнейших не срабатывает.
единственное из стандартных событий, которые я нашел, и которые работают почти как мне хочется - ProgressChanged. но оно за время обновления срабатывает 2 раза - и когда нажимаешь на кнопку - появляется 2 окошка. возможно, это не критично.
щас вот попробую найти лазейки, чтобы генерировалось событие DocumentCompleted . но если вы заранее знаете - подскажите пожалуйста, чтобы я не мучался, как это сделать
и еще кстати - нашел похожую тем на другом форуме:
http://www.gotdotnet.ru/forums/3/3927/16258/
но по ходу там на этот вопрос не ответили, также как и на мой вопрос :)
так что forum.codenet.ru рулит. ;)
Причина того, что у вас появляется два окошка при клике по кнопке - это видимо подключение обработчика два раза. Где-то событие срабатывает дважды.
Рекомендую ознакомиться с этим материалом: WebBrowser
Здесь я нарыл ещё один способ взаимодействия кода C# и HTML.
насчет рефреша - у меня он делался программно. никаких меню у меня вообще не было. но я придумал такой выход - может он тупой конечно. завел переменную = 0. когда рефреш происходит переменная ++.
а все действия что мне нужны я делаю на втором шаге рефреша. после завершения рефреша переменную обнуляю. может тупо - но работает.