使用事件处理程序声明和初始化 ToolStripMenuItem

Declare and Initialize a ToolStripMenuItem with an Event Handler

我有一个 ToolStripMenuItem,我想用一个字符串、一个图像的空值和一个用于其 Click 事件的事件处理程序来声明和实例化。这是 Intellisense 期望的格式:

ToolStripMenuItem(string text, System.Drawing.Image image, EventHandler onClick).

但是我无法分配事件处理程序,而且我不知道这样做的正确语法。作为解决方法,我在构造函数中分配 .Click 事件,就像这样...

class Timer
{
    //The other WinForms objects and my methods are omitted.
    private ToolStripMenuItem StartButton = new ToolStripMenuItem("Start Timer");

    public Timer()
    {
        //I want the assignment of StartButton_Click in my declaration and initialization of StartButton, not here.
        StartButton.Click += new EventHandler(StartButton_Click);
    }

    public void StartButton_Click(object sender, EventArgs e)
    {
        //The logic here is not relevant.
    }
}

我尝试了下面的语法,但我一直收到错误消息: "CS0236 A field initializer cannot reference the non-static field, method, or property 'Timer.StartButton_Click(object, EventArgs)'"

new ToolStripMenuItem("Start Timer", null, new EventHandler(StartButton_Click));

Intelliense 建议我使用格式

EventHandler(void(object,EventArgs)target)

但我不知道如何填写预期的语法 属性。如何编写 StartButton 的声明,以便在单击事件后调用方法 StartButton_Click?

实例化它的正确位置是在构造函数中。一次完成,像这样:

private ToolStripMenuItem StartButton;

public Timer()
{
    StartButton = new ToolStripMenuItem("Start Timer", null, StartButton_Click);
}

至于那个编译器错误,你可以read more about it here,虽然它的细节很少。

来自Stack Overflow:您不能使用一个实例变量来初始化另一个实例变量。为什么?因为编译器可以重新排列这些 - 不能保证提醒会在 StartButton_Click 之前初始化,所以上面的行可能会抛出 NullReferenceException。

将方法设为静态,您应该可以开始了。