Aracılığıyla paylaş


Bir olayý çaðýrmak

Sınıfınızın bir olayı başlatmak istiyorsanız, aşağıdaki üç öğeyi sağlamanız gerekir:

  • Olay verileri sağlayan bir sınıf.

  • Bir olay temsilci.

  • Olayı oluşturan sınıf.

Olay verileri sağlamak için sınıfını tanımlama

Yöntemi tarafından .NET Framework, bir olay ortaya çıktığında, olay işleyicileri Olay verileri geçirir. Olay verileri tarafından sağlanan System.EventArgs sınıf veya türetilmiş bir sınıf tarafından buradan.

Genellikle, bir olay, özel veri yok; olay tetiklendiðinde gerçeği tüm olay işleyicileri gerekli bilgileri sağlar. Bu durumda, olay iletebilirsiniz bir EventArgs kendi işleyicileri için nesne. EventArgs Sınıfı yalnızca bir tek üyeye sahip Empty, yani devralınan değil System.Object. Yeni bir örneğini oluşturmak için kullanılabilir EventArgs sınıfı.

Olaya özel veri varsa, bu türetilen bir sınıfı örneğini geçirebilirsiniz EventArgs olay işleyicileri için. Olay işleyicilerine geçirmeden kesin veri türüne bağlı olarak, varolan bir olay veri sınıfı kullanmak mümkün olabilir .NET Framework. Örneğin, olay işleyicisi iptal edilecek olayla ilişkili eylem veriyorsa, kullanabileceğiniz CancelEventArgs sınıfı.

Özel veri işleyicileri sağlamak gerekir ve varolan bir sınıfı kullanılabilir değil, kendi olay veri sınıfı tanımlayabilirsiniz. Gelen türetilmelidir System.EventArgs. Kural gereği, bu sınıf adlı EventNameEventArgs. Böyle bir özel olay veri sınıfı aşağıdaki örnekte gösterilmektedir. Adında bir sınıfı tanımlar AlarmEventArgs , iki olay işleyicileri için veri öğelerinin sağlar: salt okunur Time ; alarmın ne zaman gittiğini gösterir özelliği ve Snooze yeniden atanmış bir aralıktan sonra alarm olup gitmesinin veya gelecekteki alarmlar iptal olup olmadığını gösteren özellik.

Public Class AlarmEventArgs : Inherits EventArgs
   Private alarmTime As Date
   Private snoozeOn As Boolean = True

   Public Sub New(time As Date)
      Me.alarmTime = time
   End Sub

   Public ReadOnly Property Time As Date
      Get
         Return Me.alarmTime
      End Get
   End Property

   Public Property Snooze As Boolean
      Get
         Return Me.snoozeOn
      End Get
      Set
         Me.snoozeOn = value
      End Set   
   End Property   
End Class
public class AlarmEventArgs : EventArgs
{
   private DateTime alarmTime;
   private bool snoozeOn = true;

   public AlarmEventArgs(DateTime time)
   {
      this.alarmTime = time;
   }

   public DateTime Time
   {
      get { return this.alarmTime; }
   }

   public bool Snooze
   {
      get { return this.snoozeOn; }
      set { this.snoozeOn = value; }
   }   
}
public ref class AlarmEventArgs : public EventArgs
{
private: 
   System::DateTime^ alarmTime;
   bool snoozeOn;

public:
   AlarmEventArgs(System::DateTime^ time) 
   {
      this->alarmTime = time;
      this->snoozeOn = true;
   }

   property DateTime^ Time 
   {
      System::DateTime^ get()
      { return this->alarmTime; }
   }

   property bool Snooze
   {
      bool get()
      { return this->snoozeOn; }
      void set(bool snooze)
      { this->snoozeOn = snooze; }
   }
};

Olay için bir temsilci tanımlama

Olay temsilcisini olay imzası tanımlamak için kullanılır. Belirli bir olay temsilci, belirli bir olay veri sınıfı için genellikle karşılık gelir. Kuralı, olayları tarafından .NET Framework imzaya sahip EventName(sender, e), nerede sender olan bir Object olayı tetikleyen bir yapı ya da sınıf başvuru sağlar ve e olan bir EventArgs nesne veya nesne türetilmiş EventArgs Olay verileri sağlayan. Daha sonra temsilci tanım biçimi genellikle alır EventNameHandler(sender, e).

Önceden tanımlanmış bir olay veri sınıfı kullanıyorsanız.net Framework sınıf kitaplığı veya bir üçüncü taraf kitaplığında, büyük olasılıkla ilgili bir olay temsilcisini de bu Kitaplığı'nda tanımlanır. Örneğin, EventHandler temsilci ile birlikte kullanılabilir EventArgs sınıfı. Benzer şekilde, CancelEventHandler temsilci ile birlikte kullanılabilir CancelEventArgs sınıfı.

Özel olay veri sınıfı tanımlamak, olay imza tanımlamak için özel bir temsilci de tanımlayabilirsiniz veya genel kullanabilirsiniz, Action<T1, T2> temsilcisi.

Aşağıdaki örnek adlı bir olay temsilcisini tanımlar AlarmEventHandler.

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(System::Object^ sender, AlarmEventArgs^ e);

Olay oluşturmak için sınıfını tanımlama

Olayı oluşturan sınıf olay bildirimi sağlamak ve olayı başlatan bir yöntemi tanımlayın. Buna ek olarak, olayı bir sınıf özelliği veya yöntemi oluşturmak için bazı mantık sağlamanız gerekir.

Kendi sınıfını kullanarak bir olay üye tanımlayın event C# anahtar sözcüğünü ya da Event Visual Basic deyimi. Derleyici sınıfınızın Olay bildiriminde karşılaştığında özel üye gibi oluşturur:

private EventNameHandler eh = null;

Derleyici iki public yöntemler de oluşturur add_EventName ve remove_EventName. Bu birleşik veya olay temsilciden kaldırıldı Temsilciler olay kancaları yöntemlerdir eh. Programcı ayrıntılar gizlenir.

Not

C# dışındaki dillerde ve Visual Basic 2005, derleyici otomatik olarak bir olay üyeye karşılık gelen kodu üretebilir değil ve olay kancaları ve özel temsilci alanını açıkça tanımlamak zorunda kalabilirsiniz.

Aşağıdaki örnek, adlı bir olay bildirir AlarmEvent. Adında bir sınıf için örnek alınmıştır Alarm altında tam kaynak kodu gösterilir. İmzası olduğunu unutmayın AlarmEventHandler temsilcisi.

Event AlarmEvent As AlarmEventHandler
public event AlarmEventHandler AlarmEvent;
public:
   event AlarmEventHandler^ AlarmEvent; 

Olay uygulamanız tanımladıktan sonra Olay oluşturmak ne zaman belirlemeniz gerekir. Korumalı çağırarak olay Yükselt OnEventName tanımlanan olay sınıfı veya türetilmiş bir sınıf yöntemi. OnEventNameyöntemi sonra Olay yükseltir.

Not

Korumalı OnEventNameyöntemi de bir temsilci iliştirmeden Olay geçersiz kılmak türetilmiş sınıfları sağlar.Türetilmiş bir sınıf her zaman çağırması gerekir OnEventNamekayıtlı Temsilciler olay aldığınızdan emin olmak için temel sınıf yöntemi.

Aşağıdaki örnek tanımlar OnAlarmEvent düzeyine yükseltmek için sorumlu olan yöntemi AlarmEvent olay.

Protected Sub OnAlarmEvent(e As AlarmEventArgs)
   RaiseEvent AlarmEvent(Me, e)
End Sub  
protected void OnAlarmEvent(AlarmEventArgs e)
{
   AlarmEvent(this, e);
}  
protected:
   void OnAlarmEvent(AlarmEventArgs^ e)
   {
      AlarmEvent(this, e);
   }

Aşağıdaki örnek adlı bir yöntemi tanımlar Set çağırarak olayýný baþlatmak için mantığını içeren OnAlarmEvent yöntemi. Saat ve alarm saati, dakika, saat ve dakika geçerli zaman eşit, Set yöntemini başlatır bir AlarmEventArgs object ve alarm gittiğini kapatma süresi sağlar. Olay işleyicilerini yürüttükten sonra değerini denetler Snooze özelliği. Snooze Olan false, artık hiçbir alarm olay yükseltilmiş olması gereken bu nedenle Set yöntemi son. Snooze Olan true, alarm Git artırılıyor değeriyle zaman Interval özelliği.

Public Sub [Set]()
   Do
      System.Threading.Thread.Sleep(2000)
      Dim currentTime As DateTime = Date.Now
      ' Test whether it is time for the alarm to go off.
      If currentTime.Hour = alarmTime.Hour And _
         currentTime.Minute = AlarmTime.Minute Then
         Dim args As New AlarmEventArgs(currentTime)
         OnAlarmEvent(args)
         If args.Snooze = False Then 
            Exit Sub
         Else
            Me.alarmTime = Me.alarmTime.AddMinutes(Me.interval)
         End If      
      End If          
   Loop
End Sub 
public void Set()
{
   while (true) {
      System.Threading.Thread.Sleep(2000);
      DateTime currentTime = DateTime.Now;
      // Test whether it is time for the alarm to go off.
      if (currentTime.Hour == alarmTime.Hour && 
          currentTime.Minute == alarmTime.Minute)
      {    
         AlarmEventArgs args = new AlarmEventArgs(currentTime);
         OnAlarmEvent(args);
         if (! args.Snooze) 
            return;
         else
            this.alarmTime = this.alarmTime.AddMinutes(this.interval);
      }
   }
} 
void Set()
{
   do {
      Thread::Sleep(2000);
      System::DateTime^ currentTime = DateTime::Now;
      // Test whether it's time for the alarm to go off.
      if (currentTime->Hour == alarmTime->Hour && currentTime->Minute == alarmTime->Minute)
      {
         AlarmEventArgs^ args = gcnew AlarmEventArgs(currentTime);
         OnAlarmEvent(args);
         if (args->Snooze == false)
            return;
         else
            this->alarmTime = this->alarmTime->AddMinutes(this->interval);
      }
   } while (true);
}

Aşağıdaki örnekte tüm Alarm sınıfı için kaynak kodunu içerir.

Public Class Alarm
   Private alarmTime As Date
   Private interval As Integer = 10

   Event AlarmEvent As AlarmEventHandler

   Public Sub New(time As Date)
      Me.New(time, 10)
   End Sub

   Public Sub New(time As Date, interval As Integer)
      Me.alarmTime = time
      Me.interval = interval
   End Sub

   Public Sub [Set]()
      Do
         System.Threading.Thread.Sleep(2000)
         Dim currentTime As DateTime = Date.Now
         ' Test whether it is time for the alarm to go off.
         If currentTime.Hour = alarmTime.Hour And _
            currentTime.Minute = AlarmTime.Minute Then
            Dim args As New AlarmEventArgs(currentTime)
            OnAlarmEvent(args)
            If args.Snooze = False Then 
               Exit Sub
            Else
               Me.alarmTime = Me.alarmTime.AddMinutes(Me.interval)
            End If      
         End If          
      Loop
   End Sub 

   Protected Sub OnAlarmEvent(e As AlarmEventArgs)
      RaiseEvent AlarmEvent(Me, e)
   End Sub  
End Class
public class Alarm
{
   private DateTime alarmTime;
   private int interval = 10;

   public event AlarmEventHandler AlarmEvent;

   public Alarm(DateTime time) : this(time, 10)
   {
   }

   public Alarm(DateTime time, int interval)
   {
      this.alarmTime = time;
      this.interval = interval;
   }

   public void Set()
   {
      while (true) {
         System.Threading.Thread.Sleep(2000);
         DateTime currentTime = DateTime.Now;
         // Test whether it is time for the alarm to go off.
         if (currentTime.Hour == alarmTime.Hour && 
             currentTime.Minute == alarmTime.Minute)
         {    
            AlarmEventArgs args = new AlarmEventArgs(currentTime);
            OnAlarmEvent(args);
            if (! args.Snooze) 
               return;
            else
               this.alarmTime = this.alarmTime.AddMinutes(this.interval);
         }
      }
   } 

   protected void OnAlarmEvent(AlarmEventArgs e)
   {
      AlarmEvent(this, e);
   }  
}
public ref class Alarm 
{
private:
   System::DateTime^ alarmTime;
   int interval;

public:
   event AlarmEventHandler^ AlarmEvent; 
   Alarm(System::DateTime^ time) : alarmTime(time), interval(10) { };
   Alarm(System::DateTime^ time, int interval) : alarmTime(time), interval(interval) {};

   void Set()
   {
      do {
         Thread::Sleep(2000);
         System::DateTime^ currentTime = DateTime::Now;
         // Test whether it's time for the alarm to go off.
         if (currentTime->Hour == alarmTime->Hour && currentTime->Minute == alarmTime->Minute)
         {
            AlarmEventArgs^ args = gcnew AlarmEventArgs(currentTime);
            OnAlarmEvent(args);
            if (args->Snooze == false)
               return;
            else
               this->alarmTime = this->alarmTime->AddMinutes(this->interval);
         }
      } while (true);
   }

protected:
   void OnAlarmEvent(AlarmEventArgs^ e)
   {
      AlarmEvent(this, e);
   }
};

Ayrıca bkz.

Görevler

Nasıl yapılır: yükseltmek ve olayları tüketebilir

Nasıl yapılır: sınıfınızın Implement olayları

Kavramlar

Olaylar ve temsilciler

Diğer Kaynaklar

İşleme ve olaylarını tetiklemeye yönelik