如何限制一次多次触发事件

Shi*_*esh 5 .net c# events delegates

由于我没有太多的信誉来发布图像,我正在阐述一个大问题.

我有三种窗体形式,每次创建窗体时,事件的执行都会增加.

1. Form1(MainForm)

在这里,我调用包含用户控件的第二种形式(SubForm).

2. Form2(SubForm)

在这里,我通过单击用户控件来调用第二个表单(ChildForm).

3. Form3(ChildForm)

它包含一个OK按钮.

这是我的问题.

  • 首先,我打开MainForm,然后单击按钮打开第二个表单(SubForm).
  • 现在以第二种形式(SubForm)我单击显示第三种形式(ChildForm)的用户控件.
  • 当我在第三个表单中单击"确定"按钮时,表单将关闭.
  • 现在我关闭第二个表单(SubForm)而不关闭第一个表单(主表单)并单击第一个表单(MainForm)中的按钮再次打开第二个表单(SubForm).
  • 现在我在第二种形式(SubForm)中单击用户控件,并打开第三种形式(ChildForm).
  • 现在,当我在第三个表单(ChildForm)中单击"确定"时,第二个表单(SubForm)中的事件再次被触发,第三个表单(ChildForm)被打开四次.
  • 现在当我再次关闭第二个表单(SubForm)并单击用户控件并获取第三个表单(ChildForm)时,第三个表单(ChildForm)将被打开三次等等.

这是第一种形式的代码(MainForm)

private void button1_Click(object sender, EventArgs e)
{
    SubForm obj = new SubForm ();     
    obj.ShowDialog();
} 
Run Code Online (Sandbox Code Playgroud)

这是包含用户控件的第二种形式(SubForm)的代码

// Event generation
UserControl1.MouseUp += new EventHandler(this.Node_Click); 

// Event that calls the ChildForm 
private void Node_Click(object sender, EventArgs e)
{
       ChildForm obj = new ChildForm();     
       obj.ShowDialog();                
}
Run Code Online (Sandbox Code Playgroud)

这是第一种形式的代码(MainForm)

private void btnOK_Click(object sender, EventArgs e)
{
   this.Close();
} 
Run Code Online (Sandbox Code Playgroud)

谁知道为什么会这样?

Sar*_*avu 1

既然您打电话来UserControl1.MouseUp,我认为您已将该事件声明为static。因此,即使您关闭第二个表单(保持第一个表单未关闭),该事件也不会被清除。为此,您需要参加Unsubscribe活动。

使用Form_Closing事件的第二种形式来Unsubscribe事件。

private void SubForm_FormClosing(object sender, FormClosingEventArgs e)
{
    UserControl1.MouseUp -= new EventHandler(this.Node_Click);
}
Run Code Online (Sandbox Code Playgroud)