Модификация приложения Windows Forms : элемент управления WebBrowser



 

Добавим последний элемент управления: WebBrowser. Перетащим его на форму и изменим размеры элемента WebBrowser так, чтобы он заполнил форму без перекрытия элементов управления MenuStrip, ComboBox и Button. Если изменение размеров элемента управления WebBrowser затруднено, откроем его свойства, найдём параметр Dock и убедимся, что ему задано значение none, после этого установим желаемый размер. Задание параметру Anchor значения Top, Bottom, Left, Right заставит элемент управления WebBrowser корректно изменять свой размер при изменении размера окна приложения.

 

Элемент WebBrowser выполняет все сложные действия по визуализации веб-страниц. В приложении доступ к нему осуществляется через экземпляр класса WebBrowser.

 

Рис. 8. 1. Добавленый элемент управления WebBrowser

 

Модификация приложения Windows Forms : добавляем исходный код

 

Приложение должно иметь обработчик событий для всех кнопок. Начнём с кнопки GoButton.

 

Для добавления события нажатия для кнопки, необходимо дважды кликнуть на соответствующую кнопку, либо перейти в свойства кнопки и нажать на зачёк «молнии» (События):

Рис. 9. 1. Переключение со страницы свойств кнопки на страницу событий

 

Добавляем событие для кнопки и модифицируем код следующим образом:

 

   private void GoButton_Click(object sender, EventArgs e)

   {

       // Ловим пустые и неправильные адреса

       try

       {

           WebBrowser.Navigate(new Uri(AddressBox.Text.ToString()));

       }

       catch(UriFormatException Error)

       {

           // Здесь можно вставить обработчик ошибки, например вывод в MessageBox

           // catch { } можно оставить пустым, тогда все ошибки будут выловлены, но не будут отображены

           MessageBox.Show("Ошибка! Неверный формат URL-ссылки\n\nПожалуйста, используйте http://<ваш адрес>\n\nСодержание ошибки: " + Error.Message);

       }

   }

 

Поясним код: значение которое пользователь набирает в ComboBox (или выбирает из списка оправляется в новое значение для метода Uri () и метод Navigate () класса WebBrowser выполняет загрузку и отображение страницы по этому адресу.

 

А вот конструкция (try { }/catch(UriFormatException) { }) куда более интересная.

 

Оператор try-catch состоит из блока try, за которым следует одно или несколько предложений catch, в которых определяются обработчики для различных исключений. Как следует из вышесказанного у метода может быть несколько исключений. О том какие это исключения, а также о том сколько их, можно узнать да-да, наведя курсор мыши на используемый метод). При возникновении исключения среда CLR ищет оператор catch, который обрабатывает это исключение. Если выполняющийся в данный момент метод не содержит такого блока catch, то среда CLR рассматривает метод, который вызвал текущий метод, и так далее по стеку вызовов (тоесть до самого начального метода). Если блок catch не найден, то среда CLR отображает пользователю сообщение о необработанном исключении и останавливает выполнение программы (вызывая критическую ошибку и как следствие, потерю всех данных).

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

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

В нашем случае, у метода Uri () есть два исключения. Одно из них мы «поймали» и обработали, выведя пользователю сообщение в MessageBox . Show. А поймали мы пустую строку или неправильный формат URL-адреса. Само сообщение об ошибке, сгенерированное методом можно увидеть в переменной Error . Message.

 

Добавим код для меню. Событие Click кнопки Домашняя страница:

 

   private void HomeToolStripMenuItem_Click(object sender, EventArgs e)

   {

       // Если в ComboBox выбрано "Пустая страница", то нажатие кнопки Домашняя страница отправит нас по адресу в переменной HomePage

       if (AddressBox.Text == "Пустая страница")

           WebBrowser.Navigate(new Uri(HomePage));

       else

       WebBrowser.GoHome(); // Вытаскивает настоящую домашнюю страницу нашего браузера в операционной системе

   }

 

Для работы этого кода добавим после строк в файле LWP 03 Main . cs:

 

public partial class LWP03Main : Form

{

 

Объявление переменной HomePage:

 

   String HomePage = "about:blank";

 

Кнопка Назад:

 

   private void BackToolStripMenuItem_Click(object sender, EventArgs e)

   {

       WebBrowser.GoBack();

   }

 

Кнопка Вперёд:

 

   private void ForwardToolStripMenuItem_Click(object sender, EventArgs e)

   {

       WebBrowser.GoForward();

   }

 

События кнопок Назад и Вперёд вытаскивают из класса WebBrowser соответствующие методы навигации.

 

Событие Load для формы LWP 03 Main:

 

Рис. 9. 2. Событие Load для формы LWP 03 Main

 

Код события:

 

   private void LWP03Main_Load(object sender, EventArgs e)

   {

       WebBrowser.GoHome();

   }

 

Событие Navigate для элемента управления WebBrowser:

 

Рис. 9. 3. Событие Navigate для элемента управления WebBrowser

 

Код события:

 

   private void WebBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)

   {

       AddressBox.Text = WebBrowser.Url.ToString();

   }

 

Здесь, в поле ComboBox записывается текущая запись метода Url (), а именно содержание адресной строки в правильном формате URL-ардеса.

 

Последнее событие которое мы добавим в наше приложение, будет событием нажатия клавиши Enter в фокусе ComboBox (когда каретка переведена в поле ввода ComboBox). Также для этого события напишем альтернативную функция выполнения перехода по URL-адресу.

 

Событие KeyDown для элемента управления ComboBox:

 

Рис. 9. 4. Событие Key Down для элемента управления ComboBox

Код события и нового метода:

 

   private void AddressBox_KeyDown(object sender, KeyEventArgs e)

   {

       // Если была нажата клавиша Enter в фокусе ComboBox, выполняем метод Navigate() (рукописный)

       if (e.KeyCode == Keys.Enter)

       {

           Navigate(AddressBox.Text);

       }

   }

   // Метод Navigate()

   // Метод является альтернативой нажатия кнопки Перейти для наглядности

   private void Navigate(String Address)

   {

       if (String.IsNullOrEmpty(Address)) return; // Если адрес пуст, завершаем функцию

       if (Address.Equals("about:blank")) return; // Если получаем адрес пустой страницы, завершаем функцию (чтобы не делать лишнюю работу)

       // Проверяем как передан адрес: если передаётся без http:// или https:// подставляем

       if (!Address.StartsWith("http://") &&

           !Address.StartsWith("https://"))

       {

            Address = "http://" + Address;

       }

       try

       {

           WebBrowser.Navigate(new Uri(Address)); // Выполняем переход по новому сформированному адресу

       }

       catch (UriFormatException)

       {

           return;

       }

   }

 

Теперь реализуем следующую функциональность. Сразу после запуска, приложение считывает данные из ComboBox и отсылает их построчно в текстовый файл. После того, веб-браузер успешно изменит страницу, это значение тоже записывает в файл.

 

Текстовые файлы хороши для хранения любого количества информации. Если, к примеру хранить в них БД какого либо приложения, необходимо условиться с оператором разделителя для данных и соблюдать структуру строки.

Но для структурированных и специализированных данных в своё время придумали очень удобный и главное упрощающий жизнь программисту формат *. xml (об этом формате и работе с ним речь пойдёт в следующей лабораторной работе практикума).

 

Для начала нам нужно пространство имён для работы с потоками данных между приложением и файлами. Добавим строчку в самое начало файла LWP 03 Main . cs:

 

using System.IO; // Пространство имён ввода/вывода

 

Теперь добавим функцию для работы с записью в текстовый файл. Найдём в нашем коде (в том же самом файле) строчки:

 

}

       catch (UriFormatException)

       {

           return;

       }

   }

 

После них добавим:

 

   public void SaveFile(String FilePath, String[] FileArrayBox, String FileAddress, Boolean Mode)

   {

       if (Mode == true)

           File.WriteAllLines(FilePath, FileArrayBox); // Записывает в файл FilePatch массив из ComboBox, запись строк в файл идёт построчно

       if (Mode == false)

           File.AppendAllText(FilePath, FileAddress + Environment.NewLine); // Записывает в файл FilePatch введённый URL-адрес в строке а также завершает запись символом конца строки

   }

 

Мы добавили общую функцию для работы с записью файл. Ключевым переключателем является переменная Mode метода SaveFile(). Для true выполняется создание и запись все значений ComboBox и получение в качестве второго параметра массива FileArrayBox; для false дозапись (и создание нового файла, если вдруг файл не был создан) значения из ComboBox со строковым параметром FileAdress.

 

Теперь обновим методы. Добавим две новых переменных (в том же файле):

 

public partial class LWP03Main : Form

{

   String HomePage = "about:blank";

   String[] ArrayBox;

   String FilePath = "D:\\LWP03WindowsForms02 - ComboBox History.txt";

 

ArrayBox: переменная для массива значений ComboBox. FilePath: конечный путь куда записывать файл и его название с расширением.

 

Обновлённое событие Load нашей формы:

 

private void LWP03Main_Load(object sender, EventArgs e)

      {

       WebBrowser.GoHome();

       ArrayBox = AddressBox.Items.Cast<string>().ToArray();

       SaveFile(FilePath, ArrayBox, null, true); // Вызываем метод записи в текстовый файл

   }

 

Обновлённый метод Navigate () нашей формы:

 

   // Метод Navigate()

   // Метод является альтернативой нажатия кнопки Перейти для наглядности

   private void Navigate(String Address)

   {

       if (String.IsNullOrEmpty(Address)) return; // Если адрес пуст, завершаем функцию

       if (Address.Equals("about:blank")) return; // Если получаем адрес пустой страницы, завершаем функцию (чтобы не делать лишнюю работу)

       // Проверяем как передан адрес: если передаётся без http:// или https:// подставляем

       if (!Address.StartsWith("http://") &&

           !Address.StartsWith("https://"))

       {

           Address = "http://" + Address;

       }

       try

       {

           WebBrowser.Navigate(new Uri(Address)); // Выполняем переход по новому сформированному адресу

           SaveFile(FilePath, null, Address, false); // Вызываем метод записи в текстовый файл

       }

       catch (UriFormatException)

       {

           return;

       }

   }

 

Как видно из строчки:

 

           SaveFile(FilePath, null, Address, false); // Вызываем метод записи в текстовый файл

 

Чтобы не указывать лишний параметр при вызове метода, используем ключевое слово null.

 

Завершающая часть

 

Компилируем приложение (Release) и запускаем. Результат работы показан ниже (Рис. 10. 1):

Рис. 10. 1. Модифицированное приложение Windows Forms

 

Рис. 10. 2. Содержание файла созданного приложением Windows Forms после перехода по новому адресу в ComboBox

 


Дата добавления: 2019-09-13; просмотров: 224; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!