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

时间:2014-12-15 12:47:13

标签: c# .net events delegates

由于我在发布图片方面没有多少声誉,我正在详细阐述这个问题。

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

1。 Form1中(适用的MainForm)

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

2。窗体2 (子窗体)

在这里,我通过单击用户控件来调用第二个表单(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();
} 

以下是第二种形式的代码(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();                
}

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

private void btnOK_Click(object sender, EventArgs e)
{
   this.Close();
} 

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

嘿,我不确定发生了什么,但如果你想只应用node_click一次只是声明一个bool var canEnter = true; 并且这样做

    private void Node_Click(object sender, EventArgs e) { 
    if(canEnter) {
           ChildForm obj = new ChildForm();     
           obj.ShowDialog();    
canEnter=false;
 } 
             }

并为子表单(已关闭的事件)创建事件并放入其中 canEnter = TRUE; 如果我找对你,我想这就是你需要做的事情:)

答案 1 :(得分:1)

由于您正在调用UserControl1.MouseUp,我认为您已将该事件声明为static。因此,即使您关闭第二个表单(保持第一个表单未闭合),该事件也不会被清除。为此,您需要Unsubscribe事件。

将第二种形式的Form_Closing事件用于Unsubscribe事件。

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