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

时间:2015-11-25 03:53:17

标签: c# winforms event-handling

我有一个ToolStripMenuItem,我想声明并使用String实例化,图像的空值和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字段初始值设定项不能引用非静态字段,方法或属性' Timer.StartButton_Click(object,EventArgs)'"

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

Intelliense建议我使用格式

EventHandler(void(object,EventArgs)target)

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

2 个答案:

答案 0 :(得分:0)

实例化它的正确位置在构造函数中。一下子就这样做,就像这样:

private ToolStripMenuItem StartButton;

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

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

答案 1 :(得分:0)

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

让方法保持静止,你应该好好去。