
- •Тверской государственный технический университет
- •События.
- •Содержание
- •1.2. Объявление события
- •1.3. Использование события
- •1.4. Многоцелевая обработка события.
- •1.5. Использования событий в компонентах .Net
- •1.6. Классы с большим числом событий
- •1.7. Что объединяет события, делегаты и свойства
- •Объявление свойства
- •Объявление делегата
- •Объявление события
- •2. Задание на лабораторную работу
- •3. Содержание отчета по лабораторной работе
- •4. Вопросы для самопроверки Отметьте истинные высказывания:
- •1. Обработчик события:
- •2. События:
- •7. Все аргументы события принадлежат:
- •Контрольные вопросы
- •Литература:
1.4. Многоцелевая обработка события.
В предыдущем примере был рассмотрен простой случай применения события с использованием только одной функции обработчика. Однако часто необходимо в ответ на какое-то событие использовать несколько обработчиков. Рассмотрим конкретный пример.
using System;
public delegate void SampleDelegate(); // Объявление делегата
public class SampleClass // Объявление класса, генерирующего событие
{
public event SampleDelegate SampleEvent;// Объявление события типа делегата
public void onEvent() // Метод, генерирующий событие
{
if (SampleEvent != null) // Проверка наличия подписчиков
SampleEvent(); // Генерирование события
}
}
// Тестирующее приложение
public class TestApp
{
private static void handler1() // Первый метод обработки события
{ Console.WriteLine("Произошло событие: Первый обработчик"); }
private static void handler2() // Второй метод обработки события
{ Console.WriteLine("Произошло событие: Второй обработчик"); }
static public void Main ()
{
SampleClass sc = new SampleClass();
sc.SampleEvent += new SampleDelegate(handler1);
sc.SampleEvent += new SampleDelegate(handler2);
sc.onEvent();
}
}
Вначале, как и в предыдущем примере, объявляется делегат SampleDelegate, задающий сигнатуру функций обработчиков события. Затем следует объявление класса, способного генерировать некоторое событие. И, наконец, объявляется класс тестирующего приложения, который содержит объявление двух статических методов – обработчиков события handler1() и handler2() и метод Main(). В методе Main(), прежде всего, создается объект sc, способный генерировать событие. После чего осуществляется "подписка" двух статических методов реагировать на возникновение события SampleEvent в объекте sc.
1.5. Использования событий в компонентах .Net
Платформа .NET определяет некоторые дополнительные правила использования событий при создании собственных компонентов, которые будут использоваться совместно с .NET компонентами, и их необходимо придерживаться. Если создавать повторно используемые компоненты с событиями, работающие не только в проекте C#, то необходимо учитывать некоторые ограничения. В основном эти требования предъявляются к делегату и носят, скорее, синтаксический характер, не ограничивая существа дела.
Эти ограничения заключаются в следующем:
* делегат, задающий тип события, должен иметь фиксированную сигнатуру из двух аргументов: delegate <Имя_делегата> (object sender, <Тип_аргументов> args); в .NET уже определен соответствующий комбинированный делегат:
System.EventHandler.public delegate void EventHandler(object sender,EventArgs e);
* первый аргумент задает объект sender, создающий сообщение. Второй аргумент args задает остальные аргументы - входные и выходные, - передаваемые обработчику. Тип этого аргумента должен задаваться классом, производным от встроенного в .Net Framework класса EventArgs. Если обработчику никаких дополнительных аргументов не передается, то следует просто указать класс EventArgs, передавая null в качестве фактического аргумента при включении события;
* рекомендуемое имя делегата - составное, начинающееся именем события, после которого следует слово EventHandler, например, FireEventHandler. Если никаких дополнительных аргументов обработчику не передается, то тогда можно вообще делегата не объявлять, а пользоваться стандартным делегатом с именем EventHandler.
Приведем пример программы использующей событие нажатия на кнопку:
using System;
using System.WinForms;
public class SampleForm : Form
{
private Button button1 = new Button();
public static void Main (String[] args){ Application.Run(new SampleForm()); }
public SampleForm()
{
this.Text = "Delegates & Events";
button1.Text = "Event";
button1.Click += new System.EventHandler(buttonClicked);
this.Controls.Add(button1);
}
private void buttonClicked(object sender, EventArgs evArgs)
{
MessageBox.Show("Кнопка была нажата!");
}
}