C# 中删除控件的事件的方法类
方法一:
代码
/// <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);
}
}
C# 中删除控件的事件的方法类的更多相关文章
- [转] WinForm实现移除控件某个事件的方法
原文 WinForm实现移除控件某个事件的方法 本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary& ...
- VB中WinSock控件的属性、方法、事件及应用
一.WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...
- android中ListView控件&&onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- 在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法
在win7-64bit环境下,boa-constructor 0.6.1 的palette面板中没有控件图标,空白一片.将面板窗口拉大,发现那些图标在很下面的位置,X轴的排列与正常状态一致. 软件环境 ...
- 《转》在win7,boa-constructor 0.6.1 的palette面板中没有控件图标的解决方法
原地址:http://blog.csdn.net/rickleo/article/details/6532595 在win7-64bit环境下,boa-constructor 0.6.1 的palet ...
- 母版页改变被嵌套的页面中的控件ID的解决方法
使用过模板页的朋友都会很纳闷,怎么页面的用js通过getElementById(“id”):找不到对象.查看了页面源代码才发现,原来控件的ID变了,这是母版页导致的.因为母版页怕母版页本身页面中的控件 ...
- Android View中的控件和监听方法...
PS:居然三天没写博客了...今天补上...东西虽多,但是都是一些基础...代码多了一些,有人可能会这样问,粘这么多代码有毛用..其实对于一个Android的初学者来说,一个完整的代码是最容易帮助理解 ...
- 关于EasyUI中DataGrid控件的一些使用方法总结
一,DataGrid 控件的工作流程 1,通过JavaScript将一个空白的div美化成一个空白的Datagrid模板 2,Datagrid模板通过制定的Url发送请求,获取数据 ...
- winfrom中pictureBox控件的部分使用方法
一.后台属性 1.pictureBox1.Image显示图片 2.pictureBox1.ImageLocation存储和提取图片路径 二.面板属性 1.Picturebox控件SizeMode属性 ...
随机推荐
- Mybatis进阶学习笔记——关系查询——一对一查询
用户和订单的需求 通过查询订单,查询用户,就是一对一查询 (1)自定义JavaBean(常用,推荐使用) <select id="queryOrderUser" result ...
- Xtion pro live OpenNI2.2 Nite 2.2 安装配置1.0
1. 安装ubuntu14.04依赖项 $ sudo ln -s /lib/x86_64-linux-gnu/libudev.so.1.3.5 /lib/x86_64-linux-gnu/libude ...
- python中的魔法参数:*args和**kwargs
python中的魔法参数:*args和**kwargs def foo(*args, **kwargs):print 'args = ', argsprint 'kwargs = ', kwargsp ...
- 【转】Oracle 11g安装图文攻略
一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 二.Oracle安装 1. ...
- Day6------------磁盘用满的两种情况
1.文件包含元数据和写入的内容 元数据:存在硬盘中的inode ls -i /etc/passwd.bak 查看inode df -i 查看inode 2.磁盘用满的两种情况 1).内容太多 2).空 ...
- ios如何实现静音模式下声音仍然可以外放
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSes ...
- Iterator 接口
首先要从foreach说起,我们都知道对象,数组和对象可以被foreach语法遍历,数字和字符串却不行.其实除了数组和对象之外PHP内部还提供了一个 Iterator 接口,实现了Iterator接口 ...
- Python进行MySQL数据库操作
最近开始玩Python,慢慢开始喜欢上它了,以前都是用shell来实现一些自动化或者监控的操作,现在用Python来实现,感觉更棒,Python是一门很强大的面向对象语言,所以作为一个运维DBA或者运 ...
- %SystemRoot%
%SystemRoot%即C:\windows
- Visual Studio强大的帮助工具--Resharper安装与使用
ReSharper是一个JetBrains公司出品的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.使用ReSharper,你可以进行深度代码分析,智能代码协 ...