所以我一直在关注微软提供的Visual Studio教程(更具体地说是在https://msdn.microsoft.com/en-us/library/vstudio/dd492172.asp找到的数学测验)
但是我偏离了教程,因为我想看看我是否可以创建一个事件并使用EventHandler委托调用它,尽管它可能不是最好的解决方案。
public event EventHAndler quizStarted;
这是创建事件的代码。
现在在方法
中 public Form1()
{
this.quizStarted += new System.EventHandler(this.showThatTheQuizStarted);
InitializeComponent();
}
我已使用指向我的showThatTheQuizStarted方法的EventHanlder实例初始化了我的事件。
public void showThatTheQuizStarted(object sender, EventArgs e)
{
MessageBox.Show("Quiz Has Started");
}
最后当按下开始按钮时,我调用quizStarted事件,如下所示。
private void startButton_Click(object sender, EventArgs e)
{
startButton.Enabled = false;
quizStarted(this, new EventArgs());
this.StartTheQuiz();
}
按此顺序消息框在点击okay一次后消失,同样在StartTheQuiz()中没有任何内容直接或间接地调用消息框。
但如果我将this.quizStarted += new System.EventHandler(this.showThatTheQuizStarted);
行放入startButton_Click方法,则消息框会一个接一个地出现两次。
虽然我找到了一个解决方案,但我想知道如果我将这行代码放在构造函数之外,为什么会发生这种情况。
答案 0 :(得分:2)
如果...
this.quizStarted += new System.EventHandler(this.showThatTheQuizStarted);
...被多次调用,如果你在按钮内移动它会发生Click事件处理程序方法,然后你实际上每次都添加和注册一个新的事件处理程序。
换句话说,当调用quizStarted时,它可能会调用多个事件处理程序,具体取决于您选择注册的数量。如果多次注册相同的事件处理程序,那么它将被多次调用。
这就是为什么你想把注册留在一个你保证只注册一次事件处理程序的地方。