Přihlášení k odběru a odhlášení odběru událostí (Průvodce programováním v C#)
Přihlásíte se k odběru události publikované jinou třídou, pokud chcete napsat vlastní kód, který je volán při vyvolání této události. Můžete se například přihlásit k odběru události tlačítka click
, aby vaše aplikace udělala něco užitečného, když uživatel klikne na tlačítko.
Přihlášení k odběru událostí pomocí integrovaného vývojového prostředí sady Visual Studio
Pokud v návrhovém zobrazení nevidíte okno Vlastnosti, klikněte pravým tlačítkem myši na formulář nebo ovládací prvek, pro který chcete vytvořit obslužnou rutinu události, a vyberte Vlastnosti.
V horní části okna Vlastnosti klikněte na ikonu Události .
Poklikejte na událost, kterou chcete vytvořit, například
Load
na událost.Visual C# vytvoří prázdnou metodu obslužné rutiny události a přidá ji do kódu. Případně můžete kód přidat ručně v zobrazení kódu . Například následující řádky kódu deklarují metodu obslužné rutiny události, která bude volána, když
Form
třída vyvoláLoad
událost.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
Řádek kódu, který se vyžaduje k přihlášení k odběru události, se také automaticky vygeneruje v
InitializeComponent
metodě v souboru Form1.Designer.cs ve vašem projektu. Podobá se tomu:this.Load += new System.EventHandler(this.Form1_Load);
Přihlášení k odběru událostí prostřednictvím kódu programu
Definujte metodu obslužné rutiny události, jejíž podpis odpovídá podpisu delegáta události. Pokud je například událost založená na typu delegáta EventHandler , představuje následující kód zástupný kód metody:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Pomocí operátoru přiřazení sčítání (
+=
) připojte obslužnou rutinu události k události. V následujícím příkladu předpokládejme, že objekt s názvempublisher
má událost s názvemRaiseCustomEvent
. Všimněte si, že třída odběratele potřebuje odkaz na třídu vydavatele, aby se přihlásila k odběru svých událostí.publisher.RaiseCustomEvent += HandleCustomEvent;
Můžete také použít výraz lambda k určení obslužné rutiny události:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
Přihlášení k odběru událostí pomocí anonymní funkce
Pokud se od události nemusíte odhlásit později, můžete pomocí operátoru sčítání přiřazení (+=
) připojit anonymní funkci jako obslužnou rutinu události. V následujícím příkladu předpokládejme, že objekt pojmenovaný publisher
má událost s názvem RaiseCustomEvent
a že CustomEventArgs
třída byla také definována pro přenos určitého druhu specializovaných informací o události. Všimněte si, že třída odběratele potřebuje odkaz na publisher
odběr svých událostí.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Pokud jste k odběru události použili anonymní funkci, nemůžete se snadno odhlásit. Pokud se chcete v tomto scénáři odhlásit, vraťte se do kódu, ve kterém se přihlásíte k odběru události, uložte anonymní funkci do proměnné delegáta a pak přidejte delegáta do události. Doporučujeme nepoužívat anonymní funkce k přihlášení k odběru událostí, pokud se budete muset odhlásit od události později v kódu. Další informace o anonymních funkcích najdete v tématu Výrazy lambda.
Odhlášení
Pokud chcete zabránit vyvolání obslužné rutiny události při vyvolání události, zrušte odběr události. Aby se zabránilo úniku prostředků, měli byste se odhlásit z událostí, než odstraníte objekt odběratele. Dokud se neodhlásíte od události, delegát vícesměrového vysílání, který je základem události v objektu publikování, má odkaz na delegáta, který zapouzdřuje obslužnou rutinu události odběratele. Pokud objekt publikování obsahuje tento odkaz, uvolňování paměti neodstraní objekt odběratele.
Odhlášení odběru události
K odhlášení odběru události použijte operátor přiřazení odčítání (
-=
):publisher.RaiseCustomEvent -= HandleCustomEvent;
Pokud všichni odběratelé odhlásili odběr události, instance události ve třídě vydavatele je nastavena na
null
.