Blog Home  Home Feed your aggregator (RSS 2.0)  
artiso Blog - Events von WinForms Controls von Außen aufrufen
Neues rund um's Thema .Net
 
 Tuesday, October 07, 2008

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: }
Tuesday, October 07, 2008 11:41:57 PM (Mitteleuropäische Zeit, UTC+01:00)  #    Comments [0]    | 
Copyright © 2009 Thomas. All rights reserved.
DasBlog 'Portal' theme by Johnny Hughes.
Pick a theme: