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

本文关键字:初始化 ToolStripMenuItem 声明 程序 事件处理 | 更新日期: 2023-09-27 18:24:28

我有一个ToolStripMenuItem,我想用String、图像的null值和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?

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

实例化它的正确位置是在构造函数中。一次完成所有操作,如下所示:

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

至于编译器错误,您可以在这里阅读更多关于它的信息,尽管它的细节很少。

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

让这个方法保持静态,你就可以开始了。