使用事件处理程序声明和初始化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?
实例化它的正确位置是在构造函数中。一次完成所有操作,如下所示:
private ToolStripMenuItem StartButton;
public Timer()
{
StartButton = new ToolStripMenuItem("Start Timer", null, StartButton_Click);
}
至于编译器错误,您可以在这里阅读更多关于它的信息,尽管它的细节很少。
来自堆栈溢出:不能使用实例变量初始化另一个实例变量。为什么?因为编译器可以重新排列这些-不能保证提醒会在StartButton_Click之前初始化,所以上面的行可能会引发NullReferenceException。
让这个方法保持静态,你就可以开始了。