Sdílet prostřednictvím


Postupy: Implementovat události ve vaší třídě

Následující postupy popisují jak implementovat událost ve třídě. První postup implementuje událost, která nemá přidružená data; používá třídy System.EventArgs a System.EventHandler pro data události a delegáta obslužných rutin události. Druhý postup implementuje událost s vlastními daty; definuje vlastní třídy pro data události a delegáta obslužných rutin události.

PoznámkaPoznámka

Toto téma ukazuje, jak deklarovat a vyvolat událost ve třídě.Neukazuje, jak definovat obslužnou rutinu události, která zpracovává tuto událost.Informace o tom, jak zpracovávat události, naleznete v tématu Zpracování událostí a Postupy: Vyvolat a zpracovávat události.

Kompletní příklad, který znázorňuje vyvolání a zpracování událostí, naleznete v tématu Postupy: Vyvolat a zpracovávat události.

Chcete-li implementovat událost bez specifických dat

  1. Definujte veřejného člena události ve vaší třídě. Nastavte typ člena události jako delegáta System.EventHandler.

    Public Class Countdown
        ' ...
    
        Public Event CountdownCompleted As EventHandler
    End Class
    
    public class Countdown 
    {
        // ...
    
        public event EventHandler CountdownCompleted;   
    }
    
  2. Stanovte ve vaší třídě chráněnou metodu, která událost vyvolává. Pojmenujte metodu OnEventName. Uvnitř metody vyvolejte událost. Mějme na paměti, že kód jazyka C# by měl před vyvoláním dané události zkontrolovat, zda-li je událost null. To eliminuje potřebu zpracovávat NullReferenceException, k níž dojde při vyvolání události, ke které nebyly připojeny žádné obslužné rutiny. Tato kontrola je v tomto případě nezbytná, protože třída CountDown jednoduše vyvolá událost, ale neposkytuje pro ni obslužnou rutinu.

    Public Class Countdown
       ' ...
    
       Public Event CountdownCompleted As EventHandler
    
       Protected Overridable Sub OnCountdownCompleted(e As EventArgs)
          RaiseEvent CountdownCompleted(Me, e)
       End Sub
    End Class
    
    public class Countdown 
    {
        public event EventHandler CountdownCompleted;   
    
        protected virtual void OnCountdownCompleted(EventArgs e)
        {
            if (CountdownCompleted != null)
                CountdownCompleted(this, e);
        }
    }
    
  3. Určete, kdy bude událost v vaší třídě vyvolávána. Zavolejte OnEventName pro vyvolání události.

    Public Class Countdown
       Dim internalCounter As Integer = 0
        ' ...
    
       Public Event CountdownCompleted As EventHandler
    
       Protected Overridable Sub OnCountdownCompleted(e As EventArgs)
          RaiseEvent CountdownCompleted(Me, e)
       End Sub
    
       Public Sub Decrement()
          internalCounter -= 1
          If internalCounter = 0
             OnCountdownCompleted(New EventArgs())
          End If
       End Sub
    End Class
    
    public class Countdown 
    {
       int internalCounter = 0;
       // ...
    
       public event EventHandler CountdownCompleted;   
    
        protected virtual void OnCountdownCompleted(EventArgs e)
        {
            if (CountdownCompleted != null)
                CountdownCompleted(this, e);
        }
    
       public void Decrement()
       {
          internalCounter--;
          if (internalCounter == 0)
             OnCountdownCompleted(new EventArgs());
       }
    }
    

Chcete-li implementovat událost se specifickými daty

  1. Definujte třídu, která poskytuje data pro danou událost. Pojmenujte třídu EventNameArgs, odvoďte třídu z System.EventArgs a přidejte všechny specifické členy události.

    Public Class AlarmEventArgs : Inherits EventArgs
       Private nRings As Integer = 0
       Private pressed As Boolean = False
       Private text As String = "The alarm is ringing!"
    
       ' Constructor.
       Public Sub New(ByVal snoozePressed As Boolean, ByVal nRings As Integer) 
          Me.pressed = snoozePressed
          Me.nRings = nRings
       End Sub
    
       ' Properties.
       Public Property AlarmText() As String
          Get
             Return Me.text
          End Get
          Set
             Me.text = value
          End Set  
       End Property 
    
       Public ReadOnly Property NumRings() As Integer
          Get
             Return Me.nRings
          End Get   
       End Property 
    
       Public ReadOnly Property SnoozePressed() As Boolean
          Get
             Return Me.pressed
          End Get
       End Property
    End Class
    
    public class AlarmEventArgs : EventArgs 
    {
       private readonly int nRings = 0;
       private readonly bool pressed = false;
       private string text = "The alarm is ringing!";
    
       // Constructor.
       public AlarmEventArgs(bool snoozePressed, int nRings) 
       {
          this.pressed = snoozePressed;
          this.nRings = nRings;
       }
    
       // Properties.
       public string AlarmText {  
          get { return text; }
          set { this.text = value; }
       }
    
       public int NumRings {
          get { return nRings; }
       }
    
       public bool SnoozePressed {
          get { return pressed; }
       }
    }
    
  2. Deklarujte delegátu pro danou událost. Pojmenujte delegáta EventNameEventHandler.

    Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
    
    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
  3. Definujte veřejného člena události s názvem EventName ve vaší třídě. Nastavte typ člena události na typ delegáta události.

    Public Class AlarmClock
        ' ...
        Public Event Alarm As AlarmEventHandler
    
    End Class
    
    public class AlarmClock 
    {
        // ...
        public event AlarmEventHandler Alarm;
    
    }
    
  4. Definujte ve vaší třídě chráněnou metodu, která událost vyvolává. Pojmenujte metodu OnEventName. Uvnitř metody vyvolejte událost. Mějme na paměti, že kód jazyka C# by měl před vyvoláním dané události zkontrolovat, zda-li je událost null. To eliminuje potřebu zpracovávat NullReferenceException, k níž dojde při vyvolání události, ke které nebyly připojeny žádné obslužné rutiny. Tato kontrola je v tomto případě nezbytná, protože třída CountDown jednoduše vyvolá událost, ale neposkytuje pro ni obslužnou rutinu.

    Public Class AlarmClock
    
        ' ...
        Public Event Alarm As AlarmEventHandler
    
        Protected Overridable Sub OnAlarm(e As AlarmEventArgs)
            RaiseEvent Alarm(Me, e)
        End Sub
    End Class
    
    public class AlarmClock 
    {
        // ...
        public event AlarmEventHandler Alarm;
    
        protected virtual void OnAlarm(AlarmEventArgs e)
        {
          if (Alarm != null) 
              Alarm(this, e); 
        }
    }
    
  5. Určete, kdy bude událost ve vaší třídě vyvolávána. Zavolejte OnEventName pro vyvolání události a předejte specifická data události pomocí EventNameEventArgs.

    Public Class AlarmClock
    
        Public Sub Start
            ' ...
            System.Threading.Thread.Sleep(300)
            Dim e As AlarmEventArgs = New AlarmEventArgs(False, 0)
            OnAlarm(e)
        End Sub
    
        Public Event Alarm As AlarmEventHandler
    
        Protected Overridable Sub OnAlarm(e As AlarmEventArgs)
            RaiseEvent Alarm(Me, e)
        End Sub
    End Class
    
    public class AlarmClock 
    {
        public void Start()
        {
            // ...
            System.Threading.Thread.Sleep(300);
            AlarmEventArgs e = new AlarmEventArgs(false, 0);
            OnAlarm(e);
        }
    
        public event AlarmEventHandler Alarm;
    
        protected virtual void OnAlarm(AlarmEventArgs e)
        {
          if (Alarm != null) 
              Alarm(this, e); 
        }
    }
    

Příklad

V následujícím příkladu je definována třída DiskSpaceMonitor, která používá událost k vytvoření upozornění vždy, když množství volného místa na disku klesne pod procentuální hranici, která je definována v konfiguračním souboru. Také je definována třída DiskSpaceWarningEventArgs pro poskytnutí vlastních dat o volném místu na disku obslužným rutinám události.

Imports System.Collections.Specialized
Imports System.Configuration
Imports System.IO

Public Class DiskSpaceWarningEventArgs : Inherits EventArgs
   Dim currentFreeSpace As Long
   Dim currentTotalSpace As Long
   Dim driveName As String

   Public Sub New(name As String, freeSpace As Long, totalSpace As Long)
      Me.driveName = name
      Me.currentFreeSpace = freeSpace
      Me.currentTotalSpace = totalSpace
   End Sub

   Public ReadOnly Property Name As String
      Get
         Return Me.driveName
      End Get
   End Property

   Public ReadOnly Property FreeSpace As Long
      Get
         Return Me.currentFreeSpace 
      End Get
   End Property

   Public ReadOnly Property TotalSpace As Long
      Get
         Return Me.currentTotalSpace
      End Get
   End Property
End Class

Public Delegate Sub DiskSpaceWarningEventHandler(sender As Object, _
                                                 e As DiskSpaceWarningEventArgs)

Public Class DiskSpaceMonitor
   Public Event DiskSpaceWarning As DiskSpaceWarningEventHandler
   Private threshhold As Decimal 

   Public Sub New()
      ' Retrieve threshhold to fire event from configuration file.
      Try
         Dim settings As NameValueCollection = ConfigurationManager.AppSettings
         Me.threshhold = CDec(settings.Item("Threshhold"))
      ' If there is no configuration file, provide a default value.
      Catch e As ConfigurationErrorsException
         Me.threshhold = 10d
      Catch e As InvalidCastException
         Me.threshhold = 10d
      End Try               
   End Sub

   Public Sub CheckFreeSpace
      ' Get drives present on system.
      Dim drives() As DriveInfo = DriveInfo.GetDrives()
      For Each drive As DriveInfo In drives
         If drive.IsReady Then
            If drive.TotalFreeSpace/drive.TotalSize <= Me.threshhold Then
               OnDiskSpaceWarning(New DiskSpaceWarningEventArgs(drive.Name, _
                                  drive.TotalFreeSpace, drive.TotalSize))
            End If
         End If
      Next   
   End Sub

   Protected Sub OnDiskSpaceWarning(e As DiskSpaceWarningEventArgs)
      RaiseEvent DiskSpaceWarning(me, e)
   End Sub
End Class
using System;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;

public class DiskSpaceWarningEventArgs : EventArgs
{
   private long currentFreeSpace;
   private long currentTotalSpace;
   private string driveName;

   public DiskSpaceWarningEventArgs(string name, long freeSpace, long totalSpace)
   {
      this.driveName = name;
      this.currentFreeSpace = freeSpace;
      this.currentTotalSpace = totalSpace;
   }

   public string Name
   {
      get { return this.driveName; }
   }

   public long FreeSpace
   {
      get { return this.currentFreeSpace; }
   }

   public long TotalSpace
   {
      get { return this.currentTotalSpace; }
   }
}

public delegate void DiskSpaceWarningEventHandler(object sender, 
                                                  DiskSpaceWarningEventArgs e);

public class DiskSpaceMonitor
{
   public event DiskSpaceWarningEventHandler DiskSpaceWarning;
   private decimal threshhold;

   public DiskSpaceMonitor()
   {
      // Retrieve threshhold to fire event from configuration file.
      try
      {
         NameValueCollection settings = ConfigurationManager.AppSettings;
         this.threshhold = Convert.ToDecimal(settings["Threshhold"]);
      }
      // If there is no configuration file, provide a default value.
      catch (ConfigurationErrorsException)
      {
         this.threshhold = 10m;
      }
      catch (InvalidCastException)
      {
         this.threshhold = 10m;
      }
   }

   public void CheckFreeSpace()
   {
      // Get drives present on system.
      DriveInfo[] drives = DriveInfo.GetDrives();
      foreach (DriveInfo drive in drives)
      {
         if (drive.IsReady)
         {
            if (drive.TotalFreeSpace/drive.TotalSize <= this.threshhold)
               OnDiskSpaceWarning(new DiskSpaceWarningEventArgs(drive.Name, 
                                  drive.TotalFreeSpace, drive.TotalSize));
         }
      }
   }

   protected void OnDiskSpaceWarning(DiskSpaceWarningEventArgs e)
   {
      if (DiskSpaceWarning != null)
         DiskSpaceWarning(this, e);
   }   
}

Namísto použití třídy EventArgs pro poskytování dat události, je v příkladu definována třída vlastních dat události s názvem DiskSpaceWarningEventArgs. Poskytuje obslužným rutinám události název diskové jednotky a množství volného a celkového místa na disku. V příkladu je také definován delegát DiskSpaceWarningEventHandler, který představuje předpis události.

Třída DiskSpaceMonitor definuje událost DiskSpaceWarning a také poskytuje metodu OnDiskSpaceWarning, která danou událost vyvolá. Metoda OnDiskSpaceWarning je pro změnu volána metodou CheckFreeSpace, jakmile zjistí, že množství volného prostoru na jednotce je menší nebo rovno procentuální hodnotě, která je definována v konfiguračním souboru.

Viz také

Úkoly

Postupy: Vyvolat a zpracovávat události

Koncepty

Události a Delegáti

Vyvolání události

Další zdroje

Zpracování a vyvolávání událostí