求助:高手来看,问了很多网友都未能解决--->动态调用某对象上的事件.

wumylove1234 2005-08-19 09:58:48
private void Method(object sender,EventArgs e)
{
//处理
//调用sender上的Click事件
}

我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.

问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.

我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?

...全文
227 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumylove1234 2005-08-20
  • 打赏
  • 举报
回复
不好意思:jinjazz(近身剪(充电中...))

我没有仔细看你的回复.我以为只是得到列表.

非常感谢!
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
楼上两位,我在三楼已经说明:

还有,我知道完整版的Framework有:

public virtual void PerformClick();

可以直接调用Click,但是我现在的程序是智能设备的,我用的是.Net Compact Framework 1.0 SP3.而这个方法不受精简版框架支持.


这个方法不受精简版的框架支持!
jinjazz 2005-08-19
  • 打赏
  • 举报
回复
private void Method(object sender,EventArgs e)
{
//处理
((Button)sender).PerformClick();
}
happyapple050429 2005-08-19
  • 打赏
  • 举报
回复
你不是将所有的按钮的KeyDown事件都注册到了一个Method上吗?
在这个Method内写如下代码:
private void Method(object sender, System.Windows.Forms.KeyEventArgs e)
{
Button bt1 = (Button)sender;
bt1.PerformClick();

}
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
现在有一个解决办法:
写一个类,继承了Button,然后提供一个OnClick()方法.这个方法调用base.OnClick()方法.

重写我的所有的窗口中的Button,为这个新的类的实例.这样就可以调用它的OnClick方法,继而调用了基类的OnClick.

还有其它的方法吗?
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
还有,我知道完整版的Framework有:

public virtual void PerformClick();

可以直接调用Click,但是我现在的程序是智能设备的,我用的是.Net Compact Framework 1.0 SP3.而这个方法不受精简版框架支持.
JzeroBiao 2005-08-19
  • 打赏
  • 举报
回复
关注 ...
jinjazz 2005-08-19
  • 打赏
  • 举报
回复
private void Method(object sender,EventArgs e)
{
//处理
//调用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);
}
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
大哥们,没有看明白我的需求吗?呵呵,弄一些委托来干啥啊.
keansong 2005-08-19
  • 打赏
  • 举报
回复

btnX.Click += new System.EventHandler(this.btnX_Click)
btnX.Click += new System.EventHandler(this.Methid)
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
谢谢你的回复.

我现在是Click都在不同的事件处理中.

判断的方式最简单与有效的当然是判断引用.这个很简单.我现在暂时也只是使用这种"笨"方法在实现.我也知道放在一个Click中,反正都是一样的判断Sender是哪个按钮,那就和我在Key_Donw下判断是一样的了.

我是想要知道动态的得到方法.还有,只列出事件清单似呼没有用吧?怎么调用呢?
alang_jj 2005-08-19
  • 打赏
  • 举报
回复
private void butbt_Click(object sender, System.EventArgs e)
{
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) ;
}
JasonHeung 2005-08-19
  • 打赏
  • 举报
回复
private void Method(object sender,EventArgs e)
{
//处理
//调用sender上的Click事件
}

我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.

问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.

我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?

你这个思路不太对。
应该是你的所有按钮的Click事件都映射到同一个方法中作相应处理。
区分是哪个按钮引发的方法有好几种:
一、判断按钮文本
二、判断按钮的TabIndex;
三、先按钮的Tag加标记再据此判断;
jinjazz 2005-08-19
  • 打赏
  • 举报
回复
得到一个委托链上的所有方法?Reflection & Reflector Show
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");
}
wumylove1234 2005-08-19
  • 打赏
  • 举报
回复
我重写了一个按钮继承了Button.不过现在这些实例我一进入窗体就报一堆错误,并且VS.net不在再持我在IDE中直接改变对象的属性和事件等,只能在代码里自已写.很忙烦!

看来不是个最好的解决办法!!!!

请大侠来帮忙啊.!!!!!!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧