Sdílet prostřednictvím


Postupy: Zpracovat více událostí pomocí vlastností události

Chcete-li použít vlastnosti událostí (vlastní události v Visual Basic 2005), definujte vlastnosti události ve třídě, která události vyvolá a poté nastavte delegáty pro tyto vlastnosti události ve třídách, které události zpracovávají. Chcete-li ve třídě implementovat několik vlastností události, musí třída interně ukládat a udržovat delegáta definovaného pro každou událost. Typickým přístupem je implementace kolekce delegátů, která je indexována pomocí klíče události.

Pro uložení delegátů každé události můžete použít třídu EventHandlerList nebo implementovat vlastní kolekci. Třída kolekce musí poskytovat metody pro nastavení, přistupování a načítání delegáta obslužné rutiny události na základě klíče události. Můžete například použít třídu Hashtable nebo odvodit vlastní třídu ze třídy DictionaryBase. Podrobnosti implementace kolekce delegátů nemusí být vystaveny mimo danou třídu.

Každá vlastnost události v rámci třídy definuje přístupovou metodu add a přístupovou metodu remove. Přístupová metoda add vlastnosti události přidá instanci vstupního delegáta do kolekce delegátů. Přístupová metoda remove vlastnosti události odebere instanci vstupního delegáta z kolekce delegátů. Přístupové metody vlastnosti události přidávají a odebírají instance z kolekce delegátů pomocí předdefinovaného klíče pro vlastnost události.

Chcete-li zpracovat více událostí pomocí vlastností události

  1. Definujte kolekci delegátů v rámci třídy, která vyvolává události.

  2. Definujte klíč pro každou událost.

  3. Definujte vlastnosti události ve třídě, která vyvolává události.

  4. Použijte danou kolekci delegátů pro implementaci přístupových metod add a remove pro vlastnosti události.

  5. Použijte veřejné vlastnosti události pro přidání a odebrání delegátů obslužných rutin události ve třídách, které události zpracovávají.

Příklad

Následující příklad jazyka C# implementuje vlastnosti události MouseDown a MouseUp a využívá EventHandlerList k uložení delegáta každé události. Klíčová slova konstrukce vlastnosti události jsou tučnými písmeny.

PoznámkaPoznámka

Vlastnosti události nejsou podporovány v Visual Basic 2005.

' The class SampleControl defines two event properties, MouseUp and MouseDown.
Class SampleControl
    Inherits Component
    ' :
    ' Define other control methods and properties.
    ' :

    ' Define the delegate collection.
    Protected listEventDelegates As New EventHandlerList()

    ' Define a unique key for each event.
    Shared ReadOnly mouseDownEventKey As New Object()
    Shared ReadOnly mouseUpEventKey As New Object()

    ' Define the MouseDown event property.
    Public Custom Event MouseDown As MouseEventHandler
        ' Add the input delegate to the collection.
        AddHandler(Value As MouseEventHandler)
            listEventDelegates.AddHandler(mouseDownEventKey, Value)
        End AddHandler
        ' Remove the input delegate from the collection.
        RemoveHandler(Value As MouseEventHandler)
            listEventDelegates.RemoveHandler(mouseDownEventKey, Value)
        End RemoveHandler
        ' Raise the event with the delegate specified by mouseDownEventKey
        RaiseEvent(sender As Object, e As MouseEventArgs)
            Dim mouseEventDelegate As MouseEventHandler = _
                listEventDelegates(mouseDownEventKey)
            mouseEventDelegate(sender, e)
        End RaiseEvent
    End Event

    ' Define the MouseUp event property.
    Public Custom Event MouseUp As MouseEventHandler
        ' Add the input delegate to the collection.
        AddHandler(Value As MouseEventHandler)
            listEventDelegates.AddHandler(mouseUpEventKey, Value)
        End AddHandler
        ' Remove the input delegate from the collection.
        RemoveHandler(Value As MouseEventHandler)
            listEventDelegates.RemoveHandler(mouseUpEventKey, Value)
        End RemoveHandler
        ' Raise the event with the delegate specified by mouseDownUpKey
        RaiseEvent(sender As Object, e As MouseEventArgs)
            Dim mouseEventDelegate As MouseEventHandler = _
                listEventDelegates(mouseUpEventKey)
            mouseEventDelegate(sender, e)
        End RaiseEvent
    End Event
End Class
// The class SampleControl defines two event properties, MouseUp and MouseDown.
class SampleControl : Component
{
    // :
    // Define other control methods and properties.
    // :

    // Define the delegate collection.
    protected EventHandlerList listEventDelegates = new EventHandlerList();

    // Define a unique key for each event.
    static readonly object mouseDownEventKey = new object();
    static readonly object mouseUpEventKey = new object();

    // Define the MouseDown event property.
    public event MouseEventHandler MouseDown
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseDownEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseDownEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseDownEventKey
    private void OnMouseDown(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseDownEventKey];
        mouseEventDelegate(this, e);
    }

    // Define the MouseUp event property.
    public event MouseEventHandler MouseUp
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseUpEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseUpEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseUpEventKey
    private void OnMouseUp(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseUpEventKey];
        mouseEventDelegate(this, e);
    }
}
// The class SampleControl defines two event properties, MouseUp and MouseDown.
ref class SampleControl : Component
{
    // :
    // Define other control methods and properties.
    // :

    // Define the delegate collection.
protected:
    EventHandlerList^ listEventDelegates;

private:
    // Define a unique key for each event.
    static Object^ mouseDownEventKey = gcnew Object();
    static Object^ mouseUpEventKey = gcnew Object();

    // Define the MouseDown event property.
public:
    SampleControl()
    {
        listEventDelegates = gcnew EventHandlerList();
    }

    event MouseEventHandler^ MouseDown
    {
        // Add the input delegate to the collection.
        void add(MouseEventHandler^ value)
        {
            listEventDelegates->AddHandler(mouseDownEventKey, value);
        }
        // Remove the input delegate from the collection.
        void remove(MouseEventHandler^ value)
        {
            listEventDelegates->RemoveHandler(mouseDownEventKey, value);
        }
        // Raise the event with the delegate specified by mouseDownEventKey
        void raise(Object^ sender, MouseEventArgs^ e)
        {
            MouseEventHandler^ mouseEventDelegate =
                (MouseEventHandler^)listEventDelegates[mouseDownEventKey];
            mouseEventDelegate(sender, e);
        }
    }

    // Define the MouseUp event property.
    event MouseEventHandler^ MouseUp
    {
        // Add the input delegate to the collection.
        void add(MouseEventHandler^ value)
        {
            listEventDelegates->AddHandler(mouseUpEventKey, value);
        }
        // Remove the input delegate from the collection.
        void remove(MouseEventHandler^ value)
        {
            listEventDelegates->RemoveHandler(mouseUpEventKey, value);
        }
        // Raise the event with the delegate specified by mouseUpEventKey
        void raise(Object^ sender, MouseEventArgs^ e)
        {
            MouseEventHandler^ mouseEventDelegate =
                (MouseEventHandler^)listEventDelegates[mouseUpEventKey];
            mouseEventDelegate(sender, e);
        }
    }
};

Viz také

Úkoly

How to: Declare Events That Conserve Memory Use

Odkaz

System.ComponentModel.EventHandlerList

System.Web.UI.Control.Events

Koncepty

Vyvolání více událostí

Další zdroje

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