Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

можно ли поместить внутри текста кнопку с вызовом процедуры C#

47K
19 декабря 2009 года
rustamh
32 / / 19.12.2009
Здравствуйте. я впервый раз на вашем форуме.

пользуюсь VS 2008, C#
у меня такая задача - создание специфичного словаря. В текстовом файле выполняется поиск нужных слов. определяются строки где есть эти слова.
затем результат преобразуется в html путем добавления разных тегов. результат выводится в окно WinBrowser.
по сути бровзер красиво отображает строки, хранящиеся в блокноте.
я бы хотел, чтобы после каждой строки (длинная строка блокнота выглядит как целый абзац в броузере моего приложения). я бы хотел , чтобы каждая строка заканчивалась парой кнопок , которые бы листали словарь, отображая соседние строки.

ВОПРОС: можно ли в текст вкрапить кнопки, которые бы вызывали процедуры моего приложения? аналог гиперссылки, которая при нажатии не идет по адресу - а вызывает процедуру, передавая туда параметры.

подробнее задумка выглядит так.

ищется ПоисковоеСлово. Оно обнаружено в строке 115, 300, 554. в окне броузера выводится:

всего найдено 3 вхождения:
Строка 115:
текст строки 115 из блакнота в виде html
(<<)-перейти к строке 114; (>>) - перейти к строке 116 - (при нажатии выполнить процедуру, заменяющий текст строки 115 в блоке, на 114, или 116)
Строка 300:
текст строки 300 из блакнота в виде html
(<<)(>>)
Строка 554:
текст строки 554 из блакнота в виде html
(<<)(>>)
297
19 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Смотрите в сторону AttachEventHandler.

Что-то вроде:
 
Код:
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");
}
47K
20 декабря 2009 года
rustamh
32 / / 19.12.2009
спасибо большое. почти получилось.
единственное - когда вставляю команду webBrowser1.Refresh();
то при нажатии GO функция func не вызывается.
вот как у меня (тег кнопки прописан в строке browsText) .

 
Код:
webBrowser1.Document.Write(browsText);
                webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
                webBrowser1.Refresh();


не знаю как быть.
если убрать webBrowser1.Refresh(); - тогда функция вызывается, но зато окошко броузера не обновляется :(
297
20 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Нужно дождаться завершения загрузки документа (обновления), а уже затем назначать обработчики событий вновь созданным кнопкам.
Для этого создаём обработчик завершения загрузки документа и в нём пишем нужный код.
 
Код:
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.All["go"].AttachEventHandler("onclick", new EventHandler(func));
}

Обработчик евента нужно подключить:
 
Код:
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

Там, где документ рефрешится, ничего лишнего:
 
Код:
webBrowser1.Document.Write(browsText);
webBrowser1.Refresh();
47K
21 декабря 2009 года
rustamh
32 / / 19.12.2009
после первого запуска - кнопка срабатывает.
но после первого же рефреша - перестает работать.
вы привели 3 отрывка кода. средний (№2) я не понял куда вставить. но подумал - что если я через свойства элемента webBrowser1 -> Properties -> Events добавил обработчик - (код №1) - то подумал может №2 не надо писать?

и еще когда кнопка работает при первом запуске - работает только первая. а на странице много таких же кнопок. Мне наверное надо их создавать с разными именами да? да и к тому же мне ведь в каждую кнопку надо наверное номер строки передать, чтобы потом переключение правильно происходило?
47K
21 декабря 2009 года
rustamh
32 / / 19.12.2009
с множеством кнопок разобрался. при генерации кода указываю разные имена кнопок в теге буттон.
затем при AttachEventHandler обхожу все эти кнопки. и на всем множестве срабатывает процедура func.

но, теперь встал другой вопрос! - как в func передать , например название кнопки? или любую другую переменную? в документации, что я нашел, везде обработчики событий описываются без возможности передавать туда посторонние данные.

допустим у меня срабатывает такое событие:
 
Код:
webBrowser1.Document.All["go239"].AttachEventHandler("onclick", new EventHandler(func));


как мне в func передать 239 (или go239). или вообще что нибудь?

подскажите пожалуйста. у самого никак не получается. хотя я честно стараюсь
297
22 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: 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, то sender всегда почему-то null.

Ну вот, теперь я и сам разобрался, как это делается :).

Цитата: rustamh
я честно стараюсь


:) Охотно верю, это заметно.

47K
22 декабря 2009 года
rustamh
32 / / 19.12.2009
огромное вам спасибо.
мне уже неудобно докучать вам вопросами.
но никак не получается самому разобраться.

после первой загрузке текста все кнопки работают.
стоит обновить броузер - (запустить процедуру, которая заново формирует текст html , в конце которой находится рефреш) - кнопки отображаются, но при нажатии на них ничего не происходит.

я это добавление кнопок везде пытался протыкать. но так ничего не выходит.

просто событие webBrowser1_DocumentCompleted срабатывает только при изначальном составление текста броузера. а после изменений дальнейших не срабатывает.

единственное из стандартных событий, которые я нашел, и которые работают почти как мне хочется - ProgressChanged. но оно за время обновления срабатывает 2 раза - и когда нажимаешь на кнопку - появляется 2 окошка. возможно, это не критично.

щас вот попробую найти лазейки, чтобы генерировалось событие DocumentCompleted . но если вы заранее знаете - подскажите пожалуйста, чтобы я не мучался, как это сделать

и еще кстати - нашел похожую тем на другом форуме:
http://www.gotdotnet.ru/forums/3/3927/16258/
но по ходу там на этот вопрос не ответили, также как и на мой вопрос :)
так что forum.codenet.ru рулит. ;)
297
23 декабря 2009 года
koodeer
1.2K / / 02.05.2009
Я не совсем понял, какие у вас проблемы во время рефреша. В моих экспериментах с компонентом WebBrowser не возникает проблем, если вызвать метод Refresh() компонента программно. А вот если кликнуть пункт контекстного меню Refresh (того меню, что по умолчанию), тогда не происходят события - ни DocumentCompleted, ни Navigating... И побороть это пока не могу. Разве что отключить контекстное меню по умолчанию, ведь всё равно логично сделать своё.

Причина того, что у вас появляется два окошка при клике по кнопке - это видимо подключение обработчика два раза. Где-то событие срабатывает дважды.

Рекомендую ознакомиться с этим материалом: WebBrowser
Здесь я нарыл ещё один способ взаимодействия кода C# и HTML.
47K
27 декабря 2009 года
rustamh
32 / / 19.12.2009
koodeer , спасибо огромное! вы мне помогли настолько, насколько только можно мечтать. все работает теперь как было задумано изначально. и столько новых возможностей открывается.

насчет рефреша - у меня он делался программно. никаких меню у меня вообще не было. но я придумал такой выход - может он тупой конечно. завел переменную = 0. когда рефреш происходит переменная ++.
а все действия что мне нужны я делаю на втором шаге рефреша. после завершения рефреша переменную обнуляю. может тупо - но работает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог