private void Method(object sender,EventArgs e)
{
//处理
//调用sender上的Click事件
}我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?
{
//处理
//调用sender上的Click事件
}我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?
写一个类,继承了Button,然后提供一个OnClick()方法.这个方法调用base.OnClick()方法.重写我的所有的窗口中的Button,为这个新的类的实例.这样就可以调用它的OnClick方法,继而调用了基类的OnClick.还有其它的方法吗?
在这个Method内写如下代码:
private void Method(object sender, System.Windows.Forms.KeyEventArgs e)
{
Button bt1 = (Button)sender;
bt1.PerformClick();
}
{
//处理
((Button)sender).PerformClick();
}
这个方法不受精简版的框架支持!
http://blog.sunmast.com/sunmast/archive/2005/04/21/1769.aspx
根据速马blog上的方法,测试一下 private void Form1_Load(object sender, System.EventArgs e)
{
button1.Click+=new EventHandler(this.button1_Click1);
button1.Click+=new EventHandler(this.button1_Click2);
method(this.button1,e);
}
private void method(object sender,System.EventArgs e)
{ PropertyInfo pEvents = (typeof(Button)).GetProperty("Events",BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList fplist = pEvents.GetValue(sender,null) as EventHandlerList; FieldInfo fEventClick = (typeof(Control)).GetField("EventClick",BindingFlags.Static | BindingFlags.NonPublic);
object key = fEventClick.GetValue(null); Delegate d = fplist[key];
Delegate[] fps = d.GetInvocationList(); foreach(EventHandler eh in fps)
{
eh(sender,e);
} }
private void button1_Click1(object sender, System.EventArgs e)
{
MessageBox.Show("1");
}
private void button1_Click2(object sender, System.EventArgs e)
{
MessageBox.Show("2");
}
{
//处理
//调用sender上的Click事件
}我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?你这个思路不太对。
应该是你的所有按钮的Click事件都映射到同一个方法中作相应处理。
区分是哪个按钮引发的方法有好几种:
一、判断按钮文本
二、判断按钮的TabIndex;
三、先按钮的Tag加标记再据此判断;
{
this.Text = "生成触发事件";
} private void bt2_Click(object sender, System.EventArgs e)
{
//在窗体中显示此按钮
this.Controls.Add ( bt2 ) ;
} private void Form1_Load(object sender, System.EventArgs e)
{
bt2.Click += new System.EventHandler ( this.butbt_Click) ;
}
btnX.Click += new System.EventHandler(this.btnX_Click)
btnX.Click += new System.EventHandler(this.Methid)
{
//处理
//调用sender上的Click事件
PropertyInfo pEvents = (typeof(Button)).GetProperty("Events",BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList fplist = pEvents.GetValue(sender,null) as EventHandlerList; FieldInfo fEventClick = (typeof(Control)).GetField("EventClick",BindingFlags.Static | BindingFlags.NonPublic);
object key = fEventClick.GetValue(null); Delegate d = fplist[key]; ((EventHandler)d)(sender,e);
}