C#中删除控件的事件的方法类
来源:互联网 发布:烈火计划软件好用吗 编辑:程序博客网 时间:2024/06/05 21:16
方法一:
/// <summary> /// 删除指定控件的指定事件 /// </summary> /// <param name="control"></param> /// <param name="eventname"></param> public void ClearEvent(System.Windows.Forms.Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic; BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic; Type controlType = typeof(System.Windows.Forms.Control); PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags); EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null); FieldInfo fieldInfo = (typeof(System.Windows.Forms.Control)).GetField("Event" + eventname, mFieldFlags); Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; if (d == null) return; EventInfo eventInfo = controlType.GetEvent(eventname); foreach (Delegate dx in d.GetInvocationList()) eventInfo.RemoveEventHandler(control, dx); } 调用:ClearEvent(button1,"Click");//就会清除button1对象的Click事件的所有挂接事件。
写一个操作类,记录添加的事件列表,删除时从事件列表中读取出来然后删除.
class MyEventManager:IDisposable { EventHandlerList eventList = new EventHandlerList(); Hashtable eventObjectList = new Hashtable(); public void AddEvent(Control control, string eventname, EventHandler eventhandler) { string keystr = control.Name + eventname; if (!eventObjectList.Contains(keystr)) eventObjectList.Add(keystr, new object()); object eventObject = eventObjectList[keystr]; switch (eventname) { case "Click": control.Click += eventhandler; break; case "Enter": control.Enter += eventhandler; break; //... //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举 //当然用反射也可以,不过用反射就没必要用这种方法了。 } eventList.AddHandler(eventObject, eventhandler); } public void DelEvent(Control control, string eventname) { string keystr = control.Name + eventname; object eventObject = eventObjectList[keystr]; Delegate d = eventList[eventObject]; if (d == null) return; foreach (Delegate dd in d.GetInvocationList()) { switch (eventname) { case "Click": control.Click -= (EventHandler)dd; break; case "Enter": control.Enter -= (EventHandler)dd; break; //... //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举 //当然用反射也可以,不过用反射就没必要用这种方法了。 } } eventList.RemoveHandler(eventObject, d); eventObjectList.Remove(eventObject); } }
0 0
- C#中删除控件的事件的方法类
- C#中删除任意控件任意事件的事件列表的实现!
- C#中删除任意控件任意事件的事件列表的实现!
- C#中自定义控件隐藏基类成员(属性、方法和事件)的方法
- c#自定义控件中事件的处理
- MFC中彻底删除控件的方法
- 在C#中为DATAGRID控件增加一个删除按钮的一种方法
- C#中combobox 控件属性、事件、方法
- C#中事件与方法的异同
- C#中事件方法的使用
- Dev控件中GridControl控件的事件方法
- C#中自定义控件中带参数事件的实现
- c# 事件方法与窗口或控件的绑定
- C# 控件如何获取事件已经注册的方法
- C#中Combobox控件的SelectedIndexChanged事件的执行顺序
- 在C#中删除不小心添加的事件
- C# 替换控件的事件
- C#中设计器的控件事件转到逻辑代码
- SSH框架搭建遇到的问题----Unable to load configuration. - bean - jar:file:/D:/Tomcat%206.0/webapps/bar/WEB-INF
- novaclient中的源码简析
- NYOJ-71 独木舟上的旅行
- php5.5-Apache2.4-mysql5.6环境安装(win7 64位)
- P1047最小公倍数(高精度)
- C#中删除控件的事件的方法类
- PlSql安装报错 plsql some oracle net versions cannot connect from a path
- test1
- 软件开发人员的职业规划
- 【LaTeX排版】LaTeX论文模版
- Web服务器管理系列:13、用户权限分配安全设置
- Ubuntu下安装eclipse
- Several Topics On C++ fstream
- poj 2142 The Balance 扩展欧几里得