使用反射令2个事件在不知道方法名的情况下使用同一个处理方法
2008-09-05 16:35
453 查看
今天在社区碰到了一个比较有意思的问题,将button1的Click事件与button2的Click事件在不知道方法名的情况下如何使用同一个处理方法,我之前已经解答了一个类似的问题,是要用到委托列表类实现的,上代码:
private void Form1_Load(object sender, EventArgs e)
{
Button btn1 = new Button();
btn1.Text = "button1";
btn1.Click += new EventHandler(delegate(object s, EventArgs e2) { MessageBox.Show(s.ToString()); });
btn1.Name = "btn1";
btn1.Location = new Point(10, 10);
this.Controls.Add(btn1);
Button btn2 = new Button();
btn2.Text = "button2";
btn2.Name = "btn2";
btn2.Location = new Point(10, 30);
Type t = btn1.GetType();
PropertyInfo pi = t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);//获取button1的事件属性
EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn1, null);//获取button1的委托列表
FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
Delegate d = ehl[fieldInfo.GetValue(null)];
btn2.Click += (EventHandler)d;
this.Controls.Add(btn2);
}
private void Form1_Load(object sender, EventArgs e)
{
Button btn1 = new Button();
btn1.Text = "button1";
btn1.Click += new EventHandler(delegate(object s, EventArgs e2) { MessageBox.Show(s.ToString()); });
btn1.Name = "btn1";
btn1.Location = new Point(10, 10);
this.Controls.Add(btn1);
Button btn2 = new Button();
btn2.Text = "button2";
btn2.Name = "btn2";
btn2.Location = new Point(10, 30);
Type t = btn1.GetType();
PropertyInfo pi = t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);//获取button1的事件属性
EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn1, null);//获取button1的委托列表
FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
Delegate d = ehl[fieldInfo.GetValue(null)];
btn2.Click += (EventHandler)d;
this.Controls.Add(btn2);
}
相关文章推荐
- delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。 使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如
- 多个Button使用同一个事件处理方法时判断是哪个Button发生了事件
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 当使用EntityDataSource作为GridView的数据源时,在RowDataBound事件处理方法中得到对应当前行的实体对象
- 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):
- 捕获浏览器关闭、刷新事件不同情况下的处理方法
- UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。
- 使用反射机制 来把一个具体的bean 处理成一个map。并且获得其中的field和值
- 关于处理某一个事件需要关联多个事件或表的情况下,一些思考
- off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射 (
- UIView上添加了一个按钮和一个单击手势的事件相应,互相不影响的处理方法。。
- 使用handleEvent()方法,action()方法和mouseDown()方法处理事件的JAVA Application程序.
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
- 关于在用异步消息处理机制使用Message.Obtain()方法(而非New Message)获得一个Message对象的好处
- 用JS实现一个表单多个按钮的方法,两个onclick事件处理
- 使用“委托”处理同一个容器内n个RadioButton的CheckedChange事件
- 使用反射+泛型方法来处理Linq的修改
- ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法