今天在优快云上遇到有人问到如何为控件动态添加事件,记得以前也有人问到类似的问题,但都是当场写例子,当场测试,当场回答,没有记录下来,所以每次都要写一次。现在决定把例子写在这里,避免以后做重复的工作,也给其他朋友提供一个参考。 需要四个参数:控件标识(ID),控件类型,事件名称,事件委托
using System.Reflection;
public void BindMethodToControlEvent(string controlID,Type controlType,string eventName,Delegate method) { EventInfo evInfo = controlType.GetEvent(eventName); FieldInfo conInfo = this.GetType().GetField(controlID,BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if(evInfo != null && conInfo != null) evInfo.AddEventHandler(conInfo.GetValue(this),method); else throw new Exception("无效事件或事件源!"); }
调用举例:private void Form_Load(object sender, System.EventArgs e) { this.BindMethodToControlEvent("button_test",typeof(Button),"Click",new EventHandler(this.button_Click)); }
private void button_Click(object sender, System.EventArgs e) { MessageBox.Show("click"); }
以上代码在Windows xp pro + .NET Framework 1.1 下测试通过
================================================================
好像还可以继续优化一下,三个参数就够了:控件标识(ID),事件名称,事件委托
因为控件类型可以在方法内得到:
public void BindMethodToControlEvent(string controlID,string eventName,Delegate method) { FieldInfo conInfo = this.GetType().GetField(controlID,BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if(conInfo != null) { object source = conInfo.GetValue(this); EventInfo evInfo = source.GetType().GetEvent(eventName); if(evInfo == null) throw new Exception("无效事件名称"); evInfo.AddEventHandler(source,method); } else throw new Exception("无效事件源!"); }
调用:private void Form_Load(object sender, System.EventArgs e) { // button_test 为控件名称 // Click 为事件名称 this.BindMethodToControlEvent("button_test","Click",new EventHandler(this.button_Click)); }