Möchte man einen Event eines Controls per Code auslösen und somit alle registrierten Delegates aufrufen, wie es beim eigentlichen Auslösen des Events passiert, dann kann dieses Beispiel helfen. Jedes Control besitzt für seine einzelnen Events eine Methode den event auszulösen, z.B. OnClick(EventArgs e). Die Methoden sind allerdings private und können damit von außerhalb des Controls nicht so einfach aufgerufen werden. Bei einem einfachen Control wie z.B. einem Button geht das einfach durch Ableitung:
1: public partial class CustomButton : Button
2: { 3: public CustomButton()
4: { 5: InitializeComponent();
6: }
7:
8: public void RaiseClickEvent(EventArgs e)
9: { 10: base.OnClick(e);
11: }
12: }
Etwas schwieriger wird es bei komplexeren Controls, z.B. einem MenuStrip. Möchte man den Click-Event eines ToolStripMenuItem aufrufen, müsste man ja das ToolStripMenuItem ableiten, was aber zur Folge hätte, dass das komplette MenuStrip-Control umbauen muss. Hier kann man mit Hilfe von Reflection eine bessere Lösung implementieren. Bei dieser Lösung wird nur das MenuStrip abgeleitet und um eine RaiseClickEvent-Methode erweitert der als Parameter ein ToolStripItem entgegen nimmt. Auf diesem wird dann per Reflection die Private-Methode OnClick aufgerufen.
1: public partial class CustomMenuStrip : MenuStrip
2: { 3: public CustomMenuStrip()
4: { 5: }
6:
7: public void RaiseClickEvent(ToolStripItem m)
8: { 9: Type t = m.GetType();
10: object[] para = new object[1];
11: para[0] = null;
12: t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(m, para); 13: }
14: }