private void Method(object sender,EventArgs e)
{
   //处理
   //调用sender上的Click事件       
}我现在要做的是,集成处理某些按钮的KeyDown事件.
比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?

解决方案 »

  1.   

    还有,我知道完整版的Framework有:public virtual void PerformClick();可以直接调用Click,但是我现在的程序是智能设备的,我用的是.Net Compact Framework 1.0 SP3.而这个方法不受精简版框架支持.
      

  2.   

    现在有一个解决办法:
    写一个类,继承了Button,然后提供一个OnClick()方法.这个方法调用base.OnClick()方法.重写我的所有的窗口中的Button,为这个新的类的实例.这样就可以调用它的OnClick方法,继而调用了基类的OnClick.还有其它的方法吗?
      

  3.   

    你不是将所有的按钮的KeyDown事件都注册到了一个Method上吗?
    在这个Method内写如下代码:
    private void Method(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    Button bt1 = (Button)sender;
    bt1.PerformClick();
       
    }
      

  4.   

    private void Method(object sender,EventArgs e)
    {
       //处理
       ((Button)sender).PerformClick();      
    }
      

  5.   

    楼上两位,我在三楼已经说明:还有,我知道完整版的Framework有:public virtual void PerformClick();可以直接调用Click,但是我现在的程序是智能设备的,我用的是.Net Compact Framework 1.0 SP3.而这个方法不受精简版框架支持.
    这个方法不受精简版的框架支持!
      

  6.   

    我重写了一个按钮继承了Button.不过现在这些实例我一进入窗体就报一堆错误,并且VS.net不在再持我在IDE中直接改变对象的属性和事件等,只能在代码里自已写.很忙烦!看来不是个最好的解决办法!!!!请大侠来帮忙啊.!!!!!!
      

  7.   

    得到一个委托链上的所有方法?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");
    }
      

  8.   

    private void Method(object sender,EventArgs e)
    {
       //处理
       //调用sender上的Click事件       
    }我现在要做的是,集成处理某些按钮的KeyDown事件.
    比如:有5个按钮,我将所有的按钮的KeyDown事件都注册到这个Method上,在Method里我进行相应的处理之后再调用这个Sender的Click事件.问题是:我现在不能确定这个Sender是哪个按钮.我当然可以用Switch来判断Sender的引用与哪个按钮相等,然后来显示的调用此按钮的上的Click方法.但是我不想这样,因为我所有的窗体上都将有类似的应用,那将就不是动态的了.我不清楚应该如何来做,是否要用到反射来得到这个对象上的Click事件注册到哪个方法上了,然后再动态的跟据得到的方法名来调用这个方法呢?你这个思路不太对。
    应该是你的所有按钮的Click事件都映射到同一个方法中作相应处理。
    区分是哪个按钮引发的方法有好几种:
    一、判断按钮文本
    二、判断按钮的TabIndex;
    三、先按钮的Tag加标记再据此判断;
      

  9.   

    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) ;
    }
      

  10.   

    谢谢你的回复.我现在是Click都在不同的事件处理中.判断的方式最简单与有效的当然是判断引用.这个很简单.我现在暂时也只是使用这种"笨"方法在实现.我也知道放在一个Click中,反正都是一样的判断Sender是哪个按钮,那就和我在Key_Donw下判断是一样的了.我是想要知道动态的得到方法.还有,只列出事件清单似呼没有用吧?怎么调用呢?
      

  11.   


    btnX.Click += new System.EventHandler(this.btnX_Click)
    btnX.Click += new System.EventHandler(this.Methid)
      

  12.   

    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);     
    }
      

  13.   

    不好意思:jinjazz(近身剪(充电中...))我没有仔细看你的回复.我以为只是得到列表.非常感谢!