dotSITE
Work in Murano Software. Учебник по C# Шаблоны проектирования
новости материалы решения форумы группы настройки/о проекте

События

Событийная модель становится неотъемлемой частью современного программирования. Она применяется повсеместно, но наиболее часто при создании интерфейса пользователя, когда каждое действие пользователя представляется в виде события и передается определенному объекту.

Для объявления события в C# используются делегаты. Когда происходит событие, вызываются все методы делегатов, переданных классу клиентами. Приведем простой пример использования событий:

using System;
public delegate void SampleDelegate();   

public class SampleClass{
   public event SampleDelegate SampleEvent;

   public void onEvent() 
   {
      if (SampleEvent != null)
         SampleEvent();
   }
}

public class Loader{

   private static void eHandler1() 
   {
      Console.WriteLine("Произошло событие: Первый обработчик");
   }

   private static void eHandler2() 
   {
      Console.WriteLine("Произошло событие: Второй обработчик");
   }


   static public void Main ()   {
      SampleClass sc = new SampleClass();

      sc.SampleEvent += new SampleDelegate(eHandler1);
      sc.SampleEvent += new SampleDelegate(eHandler2);

      sc.onEvent();
   }
}

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

using System;
public delegate void SampleDelegate();   

public interface I {
   event SampleDelegate SampleEvent;
   void onEvent();
}

public class SampleClass: I 
{
   public event SampleDelegate SampleEvent;

   public void onEvent() 
   {
      if (SampleEvent != null)
         SampleEvent();
   }
}

public class Loader{

   private static void eHandler1() {
      Console.WriteLine("Произошло событие: Первый обработчик");
   }

   private static void eHandler2() {
      Console.WriteLine("Произошло событие: Второй обработчик");
   }


   static public void Main () {
      I i = new SampleClass();

      i.SampleEvent += new SampleDelegate(eHandler1);
      i.SampleEvent += new SampleDelegate(eHandler2);
      i.onEvent();
   }
}

Платформа .NET определяет некоторые правила использования событий, и во время написания компонентов, которые будут использоваться совместно с .NET компонентами, их необходимо придерживаться: Делегаты, используемые с событиями должны принимать два агрумента - объект, говорящий о том, кто вызвал событие; и некоторый экземпляр класса, наследованного от класса EventArgs. Для всех событий, которые не используют дополнительную информацию в .NET уже определен соответствующий комбинированный делегат - System.EventHandler.

public delegate void EventHandler(object sender,EventArgs e);

Приведем пример программы использующей событие нажатия на кнопку:

Команда компиляции:
csc /t:winexe /r:System.DLL;System.WinForms.DLL;Microsoft.Win32.Interop.DLL d.cs

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


<< Предыдущая Следующая >>

Контакт Реклама на сайте Спонсорам Веб мастерам

Лицензионное соглашение - © 2000-2012 dotSITE
Хостинг .NET предоставлен PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development