Neues rund um's Thema .Net, Team Foundation Server und SCRUM RSS 2.0
# Wednesday, October 08, 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: }
Wednesday, October 08, 2008 12:41:57 AM (Mitteleuropäische Sommerzeit, UTC+02:00)  #    Comments [0] -
Tipps und Tricks
Archive
<February 2012>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2012
Thomas
Sign In
Statistics
Total Posts: 560
This Year: 3
This Month: 1
This Week: 3
Comments: 351
Themes
All Content © 2012, Thomas
DasBlog theme 'Business' created by Christoph De Baene (delarou)