为多个表单设置单个事件处理程序

时间:2012-08-23 13:32:20

标签: c# .net winforms events

我有一些表格,在其中我有一些基本相同的事件功能

我试图实现一个'Shared'类并将Eventhandler链接到该函数,但是当我给函数提供必要的保护级别时,它会抱怨它是非静态的,我也必须使它静态化。

我不是静态功能的粉丝,所以问:有更好的方法吗?

(如果上述情况不明确:我想这样做:Set up single event handler for multiple buttons in .NET?但是有多个表单而不是多个控件)

编辑:根据要求提供更多信息:

我是关于代码重复的OCD,我的程序同时有多个表单活动/隐藏,显然我想在按下'x'时关闭整个程序:

class Shared
{
    public static void FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }

    public static void FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("Are you sure you want to exit?", "Confirm exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) {
            e.Cancel = true;
        }
    }
}

非常简单的功能,我知道,但我不喜欢重复:P

“public static”的上述“配置”工作正常,但我只是想知道是否有“更好的方法”(tm)

2 个答案:

答案 0 :(得分:1)

如果您不想要静态类,则有2种简单的选项可以满足大多数偏好:

  • 传递参​​数以形成ctor

对于单身人士:

class EventMangler {

   private static readonly _instance = new SomeHandler ();

   // although you don't like static methods  :(
   static EventMangler Instance {
      get { return _instance; }

   public void SomeEventHandler (object sender, EventArgs e) {
      // handle event
   }
}

// use EventMangler.Instance
public MyForm () {
   InitializeComponent();
   button1.Click += EventMangler.Instance.SomeEventHandler;
}

要将参数传递给Form的构造函数,您有更多选择:(a)传递对处理程序对象的引用,或(b)传递对处理程序本身的引用。我更喜欢选项(b)用于单个处理程序。否则,如果是父对象 - 例如EventMangler - 有多个处理程序,使用选项(a):

// remove singleton Instance method from EventMangler
// instantiate EventMangler in Program and pass to Form ctors

// pass a single handler reference as Action
public MyForm (Action<object, EventArgs> handler) {
   InitializeComponent();
   button1.Click += handler;
}

答案 1 :(得分:1)

您可以使用静态方法,然后将处理委托给实例,然后才使用OOP的所有漂亮

public static void GeneralHandler(object sender, EventArgs args)
{
    instance.Handle(sender, args);
}
private static MyProcessingClass instance = new MyProcessingClass();

订阅

button1.Event1 += GeneralHandler;
Button1.Event2 += GeneralHandler;
Button1.Event1 += GeneralHandler;

您可以进一步增强实现以支持依赖注入,例如引入HandlerProvider并在那里封装创建机制,同时仅暴露外部接口