C# WebBrowser. Часть 1: Получение и вывод данных

C# WebBrowser. Часть 1: Получение и вывод данных

При создании одного из своих приложений мне потребовалось реализовать в нём возможность скачивать файлы из Интернета, а так же просматривать web странички. Для решения задачи было принято решение использовать готовый control webBrowser, который дублировал и предоставлял функционал веб-браузера Internet Explorer и прекрасно подходил для решения моих задач. Оставалось только добавить данный элемент управления (Control) на форму и приступит к работе.

Так получилось, что когда в первый раз пришлось испытать данный контрол в действии, дома не было Интернета почти 2 недели, поэтому пришлось использовать локальный веб-сервер денвер. Для начала был создан тестовый сайт test.local, который состоял всего из одной простой html странички index.html.

html страница

Затем в программе Visual Studio было создано новое Windows Forms приложение, а на форму добавлено два элемента управления: Button и webBrowser. Так же было изменено стандартное имя кнопки на btnSend.

webBrowser

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

Получение и вывод данных в элемент управления webBrowser

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

Для начала вспоминаем, как мы обычно работаем с любым из веб-браузеров, например: опера, хром, IE и так далее.

1. Вводим адрес запрашиваемого ресурса в адресную строку браузера, например: csharpprogramming.ru.

2. Нажимаем на клавиатуре кнопку Enter, после чего в окне браузера появляются или выводятся какие-то данные, например: картинки, видео, текст, — одним словом, контент.

На самом деле за этими двумя действиями скрыт большой объем работы, например: обмен запросами между браузером и сервером, преобразование доменного имени ресурса в ip адрес, многочисленные проверки, парсинг полученных данных от сервера, перед выводом в окно браузера и это лишь малая часть действий, которые выполняются после нажатия клавиши Enter.

Адресная строка веб-браузера

И так первое, что требуется сделать, это ввести адрес ресурса, обычно представленный в виде доменного имени, в моем случае test.local, в адресную строку браузера.

В данный момент на форме расположен control webBrowser, который только выводит окончательные результаты запросов. Чтобы получить возможность использовать адресную строку в своем приложении, можно добавить на форму control TextBox, в поле ввода которого будет вводиться адрес ресурса. Но, так как сайт у меня всего один, то пока что я решил ограничиться всего лишь полем типа string, в котором будет хранить адрес нужного мне ресурса.

string url = @"http://test.local";

Первая задача решена, переходим ко второй.

webBrowser Navigate

После того, как адрес был введён, нужно нажать клавишу Enter, после чего произойдет отправка запроса на сервер, в ответ на который будут получены какие-то данные, в моем случае обычная html разметка.

Если для ввода адреса Вы используете control TextBox, то для того, чтобы отловить нажатие клавиши Enter, можно использовать событие KeyDown.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter & textBox1.Text != "")
{
webBrowser1.Navigate(textBox1.Text.Trim());
}
}

Внутри обработчика данного события выполняется всего один метод Navigate, который осуществляет переход (запрос) по указанному нами адресу, взятому из поля url (TextBox), получает ответ от сервера, после чего выполняет загрузку полученных данных в контрол webBrowser.

Так как у меня на форме нет контрола TextBox, то воспользуюсь кнопкой btnSend, которая будет выполнять все те же действия, что и нажатая клавиша Enter, но только по клику мышкой. Для этого сначала подпишем кнопку btnSend на событие Click, внутри которого будет выполняться всё тот же метод Navigate. Если кликать лень, то так же подписываемся на событие KeyDown, только на этот раз для кнопки btnSend.

//код для вставки в событие Click
webBrowser1.Navigate(url);

либо так

webBrowser1.Navigate(new Uri(url));

webBrowser.Url

Вместо метода Navigate, так же можно использовать свойство Url, которое работает похожим образом

1). Сначала указываем адрес ресурса, куда будет осуществляться запрос
2). Происходит скрытый вызов метода Navigate.

//поле типа Uri
Uri url = new Uri("http://test.local");
//код для вставки в событие Click
webBrowser1.Url = url;

Как видно запросить и получить данные, используя control webBrowser очень просто, для этого всего лишь потребовалось несколько строчек кода.

В следующей статье более подробно рассмотрим, что происходит во время выполнения метода Navigate.

Читайте также:

15 комментариев

  1. Дмитрий says:

    Уважаемый Админ,есть проблемка.
    В webbrower стартовая страница гугл,нужно что бы по переходу на ссылки в поисковике открывались в браузере по умолчанию.Помогите пожалуйста.

  2. Вам нужно сделать ссылку на стартовую страницу?

    webBrowser1.GoHome();
  3. Дмитрий says:

    Нет.По дефолту стоит страница google.com,я ввожу любое слово в поисковую строку и в результате нажать на любую ссылку,которая уже откроется допустим Google Chrom который стоит у меня по умолчанию.

  4. Понятно. Тогда нужно просто найти ссылку на странице, а затем нажать на неё, принцип такой же как с кнопкой.

    Как нажать на кнопку в окне webBrowser

    Единственное я не знаю, как работает контрол WebKitBrowser, так как я им никогда не пользовался.

  5. Дмитрий says:

    Использую WebKitBrowser

  6. Тогда скорее всего свойства Links просто нет у данного объекта, потому что это два разных контрола.

  7. Иван says:

    Привет. Вверху код для textboxa событие KeyDown — это все понятно, а как прикрутить это нажатие к условию if? т.е Код:
    if ( в textbox1 нажата кнопка) то {…}
    И еще вопрос (парюсь никак не пойму как записать код)
    Проверка на изменение в textbox1?
    Я понял что нужно что-то прописать в textBox1_TextChanged, а самое непонятное как составить if (если НЕ было изменений в textbox1) то {…}

  8. «if ( в textbox1 нажата кнопка) то {…}»

    Данная проверка обычно выполняется внутри события KeyDown:

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
    //если нажата кнопка Enter
    if (e.KeyCode == Keys.Enter)
    {
    //выполняются какие-то действия
    }
    }

    «if (если НЕ было изменений в textbox1)»

    Ничего прописать не нужно, потому что данное событие (TextChanged) возникает каждый раз при изменение поля контрола textBox.
    Соответственно если это событие не возникает, то значит изменений — нет.

  9. Иван says:

    Хм. не совсем понял что куда.
    У меня есть textbox в который я ввожу слово и ищу его в datagrid по нажатию кнопки Enter или button9.
    И есть кнопка «Добавить это слово в XML» (button12).
    Не делая прорку на пустоту textbox4, в xml добавлялся только закрывающий тег и все.
    Я сделал проверку на пустоту «если в textbox пусто, то ничего не сохраняем».

    Вот код:

    private void button12_Click(object sender, EventArgs e)
    {
    // если поле textBox4 пустое, то выводим сообщ и ничего не делаем.
    if (textBox4.Text == "")
    {
    MessageBox.Show("Тестовое поле пустое");
    }
    else
    {
    //тут описание создания таблицы, (если она есть то загрузим из файла)
    //и добавления слова в xml из textbox
    }
    }

    и вот мне нужно проверить, если я ввел слово в textbox, сохранил его по кнопке button12, а теперь чтобы еще раз нажав кнопку 12 не было добавления этого же слова из textbox в xml…. т.е проверка что слово не изменилось и не нужно сохранять его еще раз.
    Помогите, а?
    По вашей подсказке: сделал проверку с нажатием в кнопке12, но понимаю что, что-то не то.
    А переносить проверку нажатия в textbox — я по enter ищу слова, а сохраняю по кнопке12.
    Что-т совсем запутался.

  10. Иван says:

    Уф, методом тыка сделал так: в

    private void textBox4_TextChanged
    засунул
    переменная = true;
    а в нажатии кнопки
    if (переменная == false) то вывод сообщения и все
    else {выполнять все что положено}

    —————————-
    не получается вот такая штука. хочу проверить загружена ли информация в datagrid да/нет.
    dataGridView1.Visible == false — не работает (так как датагрид всегда видна, а вот данные могут быть в ней а могут нет)

  11. мне нужно проверить, чтобы не было добавления этого же слова из textbox в xml

    Так проверку та нужно выполнять наличия узла или элемента с этим значением внутри xml файла, а не слова, которое вводится в текстовое поле.

    Пример:

    using System.Xml.Linq;
    //загружаем xml файл
    XDocument xDoc = XDocument.Load("имя_файла.xml");
    //находим все узлы name, который содержат значение, введенное в textbox
    var xNodes = xDoc.Descendants("name").Where(x => x.Value == textBox1.Text);
    if ( xNodes.Count() > 0 )
    {
    //значение найдено
    }
    else
    {
    //значение не найдено
    }

    «не получается вот такая штука. хочу проверить загружена ли информация в datagrid да/нет.»

    Можно перебрать все строки и проверить наличие значения, например, в том же цикле foreach.

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
    if (row.Cells["название колонки"].Value.ToString() == "значение")
    {
    //содержит
    }
    }
  12. Иван says:

    А если не конкретное значение, а вообще наличие?
    if (row.Cells[«название колонки»].Value.ToString() == «значение»)
    вместо «значение» как написать?

  13. «А если не конкретное значение, а вообще наличие?»

    Наличие чего? Строки, ячейки, значения…

  14. Иван says:

    вообще наличие значений
    if (row.Cells[«название колонки»].Value.ToString() == «есть ли вообще значения в колонке»)

  15. например, так:

    if ( !String.IsNullOrEmpty(row.Cells[«название колонки»].Value.ToString()) )
    {
    //ячейка содержит значение
    }

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*