Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Пользовательские элементы управления
Переопределение наследуемого от Control виртуального метода диспетчеризации события Click
Большинство библиотечных классов, в которых определены события, имеют соответствующие виртуальные методы диспетчеризации с приставкой On. Эти методы можно переопределять в классах-наследниках, дополняя нужным кодом. Воспользуемся этой возможностью в нашем классе расширения кнопки, упаковав переопределение метода в отдельную часть класса BeepButton.
- Дополните конец файла BeepButton.cs следующим кодом
namespace MyCompany.UserControls { partial class BeepButton { // Переопределяем виртуальный метод диспетчеризации // класса Control (задействуется наследуемый метод // диспетчеризации класса кнопки) protected override void OnClick(EventArgs e) { // Проиграть системный звук SystemSounds.Exclamation.Play();// Сочный через внешние динамики //SystemSounds.Beep.Play(); // Простой через внешние динамики //System.Console.Beep(); // Простой через внутренний динамик // Подняться до базового класса Control, // чтобы сгенерировать его событие Click и // запустить наш будущий обработчик ButtonOnClick base.OnClick(e); } } }Листинг 17.2 . Переопределение метода диспетчеризации OnClick() в файле BeepButton.cs
В переопределенном методе диспетчеризации события Click кнопки мы предусмотрели вызов базового метода диспетчеризации непосредственно кнопки Button, чтобы дать возможность клиентам нашего класса BeepButton подписать свои обработчики на это событие. Событие Click, в свою очередь, унаследовано классом Button от класса Control и генерируется его методом OnClick примерно так
protected virtual void OnClick(EventArgs args) { //... // Если хоть один обработчик зарегистрирован if (Click != null) Click(this, args); //... }
Испытание кнопки BeepButton мы проведем позднее, разработав для этого тестовую исполнимую Windows -сборку.
Упражнение 2. Проектирование диалогового окна сообщений MyDialogBox
В данном разделе мы спроектируем собственное простое диалоговое окно сообщений с именем MyDialogBox, которое и будет вызываться из обработчика события Click нашей кнопки, если на него подпишется клиент компонента BeepButton.
Создание диалогового окна будет состоять из трех шагов:
- Создание самой формы диалогового окна (класс MyDialogForm )
- Размещение на форме интерфейсных элементов пользователя
- Создание класса MyDialogBox.cs, управляющего диалоговым окном
- В панели Solution Explorer выделите узел проекта UserControls и командой Add/Windows Form добавьте к компоненту файл формы с именем MyDialogForm.cs
- Удалите из узла References лишние добавленные мастером ссылки на библиотечные сборки System.Data и System.Xml
- Удалите соответствующие инструкции using подключения пространств имен в начале файла MyDialogForm.cs
- Настройте форму MyDialogForm в соответствии с таблицей
- Из свитка Containers панели инструментов Toolbox поместите на форму компоновочную панель FlowLayoutPanel и настройте ее в соответствии с таблицей
Эта панель будет следить за размещением своих дочерних элементов в соответствии с настройками.
- Поместите внутрь экземпляра компоновочной панели flow из свитка Common Controls текстовую метку Label и настройте ее свойства в соответствии с таблицей
Для того, чтобы объект lblMessage был доступен из метода класса MyDialogBox, при его создании мы сделали его общедоступным.
- Поместите внутрь компоновочной панели flow из свитка Common Controls кнопку Button и настройте ее свойства в соответствии с таблицей
Свойству дочерних кнопок формы DialogResult можно присвоить любое значение из перечисления System.Windows.Forms.DialogResult ( Abort, Cancel, Ignore, No, None, OK, Retry, Yes ). Оно и будет возвращено функцией ShowDialog() формы, если пользователь выберет именно эту кнопку.
Мы создали интерфейсный класс диалогового окна. Теперь нужно создать управляющий класс, в котором мы будем создавать экземпляр интерфейсного класса диалогового окна и вызывать его на экран.
- В панели Solution Explorer выделите узел проекта UserControls и, выполнив команду меню Project/Add Class, добавьте к проекту новый класс с именем MyDialogBox
- Заполните файл MyDialogBox.cs следующим кодом
using System; using System.Windows.Forms; namespace MyCompany.UserControls { // Наше диалоговое окно сообщения public class MyDialogBox { public static DialogResult Show(string strMessage, string strCaption) { // Создаем диалоговое окно MyDialogForm frm = new MyDialogForm(); // Заголовок окна frm.Text = strCaption; // Содержимое текстовой метки frm.lblMessage.Text = strMessage; // Отобразить диалоговое окно в модальном режиме, // а после его закрытия вернуть выбор пользователя // вызывающему коду return frm.ShowDialog();// Выполняем диалоговое окно // и возвращаем статус нажатой кнопки } } }Листинг 17.3 . Код управления диалоговым окном в файле MyDialogBox.cs
Класс MyDialogBox нужно объявить с модификатором public, чтобы он был виден в клиентских сборках. Объявление метода Show() в классе MyDialogBox как статического позволяет его вызывать без создания экземпляра этого класса в клиенте. Через аргументы метода Show() можно задавать заголовок диалогового окна и содержимое текстовой метки lblMessage, как это принято в библиотечном классе System.Windows.Forms.MessageBox.
Теперь осталось собрать все вместе и испытать на тестовом приложении, но прежде нужно откомпилировать проект UserControls и убедиться, что нет синтаксических ошибок.
- Выполните команду меню оболочки Build/Build UserControls, чтобы откомпилировать проект нашей библиотеки пользовательских элементов управления