Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр2_События_б.doc
Скачиваний:
10
Добавлен:
16.08.2019
Размер:
152.58 Кб
Скачать

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("Кнопка была нажата!");

    }

}