1. 方法一:
  2. 代码
  3. /// <summary>
  4. /// 删除指定控件的指定事件
  5. /// </summary>
  6. /// <param name="control"></param>
  7. /// <param name="eventname"></param>
  8. public void ClearEvent(System.Windows.Forms.Control control, string eventname)
  9. {
  10. if (control == null) return;
  11. if (string.IsNullOrEmpty(eventname)) return;
  12.  
  13. BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic;
  14. BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic;
  15. Type controlType = typeof(System.Windows.Forms.Control);
  16. PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
  17. EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
  18. FieldInfo fieldInfo = (typeof(System.Windows.Forms.Control)).GetField("Event" + eventname, mFieldFlags);
  19. Delegate d = eventHandlerList[fieldInfo.GetValue(control)];
  20.  
  21. if (d == null) return;
  22. EventInfo eventInfo = controlType.GetEvent(eventname);
  23.  
  24. foreach (Delegate dx in d.GetInvocationList())
  25. eventInfo.RemoveEventHandler(control, dx);
  26.  
  27. }
  28. 调用:ClearEvent(button1,"Click");//就会清除button1对象的Click事件的所有挂接事件。
  29.  
  30. 方法二,写一个操作类,记录添加的事件列表,删除时从事件列表中读取出来然后删除.
  31.  
  32. 代码
  33. class MyEventManager:IDisposable
  34. {
  35. EventHandlerList eventList = new EventHandlerList();
  36. Hashtable eventObjectList = new Hashtable();
  37. public void AddEvent(Control control, string eventname, EventHandler eventhandler)
  38. {
  39. string keystr = control.Name + eventname;
  40. if (!eventObjectList.Contains(keystr)) eventObjectList.Add(keystr, new object());
  41. object eventObject = eventObjectList[keystr];
  42. switch (eventname)
  43. {
  44. case "Click":
  45. control.Click += eventhandler;
  46. break;
  47. case "Enter":
  48. control.Enter += eventhandler;
  49. break;
  50. //...
  51. //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举
  52. //当然用反射也可以,不过用反射就没必要用这种方法了。
  53. }
  54. eventList.AddHandler(eventObject, eventhandler);
  55. }
  56. public void DelEvent(Control control, string eventname)
  57. {
  58. string keystr = control.Name + eventname;
  59. object eventObject = eventObjectList[keystr];
  60. Delegate d = eventList[eventObject];
  61. if (d == null) return;
  62. foreach (Delegate dd in d.GetInvocationList())
  63. {
  64. switch (eventname)
  65. {
  66. case "Click":
  67. control.Click -= (EventHandler)dd;
  68. break;
  69. case "Enter":
  70. control.Enter -= (EventHandler)dd;
  71. break;
  72. //...
  73. //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举
  74. //当然用反射也可以,不过用反射就没必要用这种方法了。
  75. }
  76.  
  77. }
  78.  
  79. eventList.RemoveHandler(eventObject, d);
  80. eventObjectList.Remove(eventObject);
  81. }
  82. }

C# 中删除控件的事件的方法类的更多相关文章

  1. [转] WinForm实现移除控件某个事件的方法

    原文 WinForm实现移除控件某个事件的方法 本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary& ...

  2. VB中WinSock控件的属性、方法、事件及应用

    一.WinSock简介       Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...

  3. android中ListView控件&&onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  4. 在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法

    在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标,空白一片.将面板窗口拉大,发现那些图标在很下面的位置,X轴的排列与正常状态一致. 软件环境 ...

  5. 《转》在win7,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法

    原地址:http://blog.csdn.net/rickleo/article/details/6532595 在win7-64bit环境下,boa-constructor 0.6.1 的palet ...

  6. 母版页改变被嵌套的页面中的控件ID的解决方法

    使用过模板页的朋友都会很纳闷,怎么页面的用js通过getElementById(“id”):找不到对象.查看了页面源代码才发现,原来控件的ID变了,这是母版页导致的.因为母版页怕母版页本身页面中的控件 ...

  7. Android View中的控件和监听方法...

    PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...

  8. 关于EasyUI中DataGrid控件的一些使用方法总结

    一,DataGrid         控件的工作流程 1,通过JavaScript将一个空白的div美化成一个空白的Datagrid模板 2,Datagrid模板通过制定的Url发送请求,获取数据   ...

  9. winfrom中pictureBox控件的部分使用方法

    一.后台属性 1.pictureBox1.Image显示图片 2.pictureBox1.ImageLocation存储和提取图片路径 二.面板属性 1.Picturebox控件SizeMode属性 ...

随机推荐

  1. Bootstrap 时间控件datetimepicker与timepicker

    一.datetimepicker 首先,我们看看点击选择时间的时候的展示页面吧 年                                                月           ...

  2. Debian & CentOS建立本地iso源

    在宿舍搞开发的时候经常遇到有些工具需要安装,没有网络,这时候只能靠mount本地的iso镜像来搞,结果像Debian有3张安装光盘,CentOS有2张光盘,有时候安装包不在第一张光盘里,而在第二张光盘 ...

  3. 2018-2019 前期任务(一):资料阅读&Python入门

    2018-2019 前期任务(一):资料阅读&Python入门 资料原文地址:Dumbcoin - An educational python implementation of a bitc ...

  4. 基于URL的权限管理(三)

    思路:先创建一个专门的类ActiveUser用于存储用户登录的信息,主要用于存储用户id,账户,名称,菜单,权限. 认证拦截器主要是查看用户是否已登陆,如果没有转发到登陆界面,用户用账户跟密码登录时候 ...

  5. Principal components analysis(PCA):主元分析

    在因子分析(Factor analysis)中,介绍了一种降维概率模型,用EM算法(EM算法原理详解)估计参数.在这里讨论另外一种降维方法:主元分析法(PCA),这种算法更加直接,只需要进行特征向量的 ...

  6. Three.js基础探寻二——正交投影照相机

    本篇主要介绍照相机中的正交投影照相机. 第一篇传送门:Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式. 针对投影方式照相机分为正交投影照相机和透视投影照相机 ...

  7. Java 集合系列0、概述

    概述: Collection 框架中 从最上层的核心主干可以看到:Iterator.Collection.Map 三个接口(拓展思考1)1.Collection 接口:主要包括了集合中的一些常用操作, ...

  8. C# 关于用7zip压缩文件提示win32exception 系统找不到文件解决方案(win7 x64)

    网上已经很多这方面的资料了,我就简单的说下好了 为了方便以后的查看 --------------------- 1.需要下载7zSharp:http://7zsharp.codeplex.com/re ...

  9. SKlearn库学习曲线

    思想: # 1.现将所有样本用交叉验证方法或者(随机抽样方法) 得到 K对 训练集-验证集# 2.依次对K个训练集,拿出数量不断增加的子集如m个,并在这些K*m个子集上训练模型.# 3.依次在对应训练 ...

  10. PYTHON-基本数据类型-数字类型,字符串类型,列表类型-练习

    # 字符串练习# 写代码,有如下变量,请按照要求实现每个功能 (共6分,每小题各0.5分)# name = " aleX"# # 1) 移除 name 变量对应的值两边的空格,并输 ...