Тверской государственный университет
Опубликован: 22.11.2005 | Доступ: свободный | Студентов: 30399 / 1845 | Оценка: 4.31 / 3.69 | Длительность: 28:26:00
ISBN: 978-5-9556-0050-5
Лекция 21:

События

Класс sender

Рассмотрим теперь, как устроен в нашем примере класс, создающий события. Начнем со свойств класса:

// Класс, создающий событие. Потомок класса ArrayList.
public class ListWithChangedEvent: ArrayList
{
  //Свойства класса: событие и его аргументы
  //Событие Changed, зажигаемое при всех изменениях 
  //элементов списка.
  public event ChangedEventHandler Changed;
  //Аргументы события
  private ChangedEventArgs evargs = new ChangedEventArgs();

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

Хороший стиль требует задания в классе процедуры On, включающей событие. Так и поступим:

//Методы класса: процедура On и переопределяемые методы.
//Процедура On, включающая событие
protected virtual void OnChanged(ChangedEventArgs args)
{
  if (Changed != null)
    Changed(this, args);
}

Процедура OnChanged полностью соответствует ранее описанному образцу, поэтому не требует дополнительных комментариев.

Наш класс, являясь наследником класса ArrayList, наследует все его методы. Переопределим методы, изменяющие элементы:

  • метод Add, добавляющий новый элемент в конец списка;
  • индексатор this, дающий доступ к элементу списка по индексу;
  • метод Clear, производящий чистку списка.
//Переопределяемые методы, вызывающие событие Changed
//Добавление нового элемента
//при получении разрешения у обработчиков события
public override int Add(object value)
{
  int i=0;
  evargs.Item = value;
  OnChanged(evargs);
  if (evargs.Permit)
    i = base.Add(value);
  else
    Console.WriteLine("Добавление элемента запрещено." +
      "Значение =  {0}", value);
  return i;
}
public override void Clear()
{
  evargs.Item=0;      
  OnChanged(evargs);
  base.Clear();
}
public override object this[int index]
{
  set
  {
    evargs.Item = value;
    OnChanged(evargs);
    if (evargs.Permit)
      base[index] = value;
    else
      Console.WriteLine("Замена элемента запрещена." +
        " Значение =  {0}", value);
  }
  get{return(base[index]);}
}

Обратите внимание на схему включения события, например, в процедуре Add. Вначале задаются входные аргументы, в данном случае Item. Затем вызывается процедура включения OnChanged. При зажигании выполнение процедуры Add прерывается. Запускаются обработчики, присоединенные к событию. Процедура Add продолжит работу только после окончания их работы. Анализ выходной переменной Permit позволяет установить, получено ли разрешение на изменение значения; при истинности значения этой переменной вызывается родительский метод Add, осуществляющий изменение значения. Это достаточно типичная схема работы с событиями.

Александр Галабудник
Александр Галабудник

Не обнаружил проекты, которые используются в примерах в лекции, также не увидел список задач.

Александра Гусева
Александра Гусева