为控件动态添加事件

 今天在CSDN上遇到有人问到如何为控件动态添加事件,记得以前也有人问到类似的问题,但都是当场写例子,当场测试,当场回答,没有记录下来,所以每次都要写一次。现在决定把例子写在这里,避免以后做重复的工作,也给其他朋友提供一个参考。 需要四个参数:控件标识(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));     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值