是否有可能触发发件人对象的事件(处理程序)以及如何触发?

时间:2013-01-16 16:47:43

标签: c# winforms events object dynamic

我有一个用户界面控件,其中有多个用户界面对象,其中有不同的事件处理程序订阅了他们的双击事件,有没有办法触发双击事件以响应比如这样的keydown事件:< / p>

 private void UIObject_KeyDown(object sender, KeyEventArgs e)
 {
      if (e.KeyCode == Keys.Enter)
      {
           ((Control)sender).DoubleClick.Trigger(); //note: senders of varied types
      }
 }

? VSI说'...... DoubleClick只能出现在 - =或+ ='的左侧,因此向两种不同的发送方对象类型添加可调用方法似乎是我最简单的希望,但是类似于:.Perform [[ Double]] Click()会比dunch好得多。

3 个答案:

答案 0 :(得分:1)

不,这是不可能的。事件只能从定义它们的类型触发。也就是说,除非你有自己的类型(在这种情况下你可以暴露一个触发你的事件的方法)。

根据您附加事件处理程序的方式,您可以创建一个具有委托/事件的单独对象,也可以向其添加所有相同的处理程序;这将允许您触发/调用它而不是Control对象的方法。

答案 1 :(得分:0)

您可以直接调用事件处理程序,只要它们可见(即同一个类中的private或另一个类中的public / internal)。

 private void UIObject_KeyDown(object sender, KeyEventArgs e)
 {
      if (e.KeyCode == Keys.Enter)
      {
           OtherUIObject_DoubleClick(sender, e); 
           // You can replace "sender" with "this", and/or replace "e" with a new EventArgs.
      }
 }
 private void OtherUIObject_DoubleClick(object sender, EventArgs e)
 {
    // Code
 }

答案 2 :(得分:0)

维护控件到委托的映射可能更容易,然后对所有控件使用相同的双击和按键处理程序。

private Dictionary<Control, Action> _controlsToActions = new Dictionary<Control, Action>() {
    { control1, method1 } // one for each control/handler pair
};

private void UIObject_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
      _controlsToActions[(Control)sender]();
    }
}

private void UIObject_DoubleClick(object sender, KeyEventArgs e)
{
    _controlsToActions[(Control)sender]();
}