如何限制事件一次只触发一次?

5
由于我声望不高,无法发布图片,因此我详细描述一个大问题。我有三个窗体,每次创建窗体时事件执行次数都会增加。
1. MainForm(Form1)
在此,我调用包含用户控件的第二个窗体(SubForm)。
2. SubForm(Form2)
在此,我通过单击用户控件调用第二个窗体(ChildForm)。
3. ChildForm(Form3)
它包含一个"确定"按钮。
这是我的问题。
- 首先,我打开主窗体(MainForm),然后单击按钮打开第二个窗体(SubForm)。 - 现在,在第二个窗体(SubForm)中,我单击用户控件,显示了第三个窗体(ChildForm)。 - 当我单击第三个窗体(ChildForm)中的"确定"按钮时,该窗体关闭。 - 现在,我关闭第二个窗体(SubForm),而不关闭第一窗体(MainForm),然后再次单击第一窗体(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();
} 

有人知道为什么会出现这种情况吗?

MouseUp 事件的赋值发生在哪里? - DonBoitnott
1
你在哪里订阅 UserControl1.MouseUp += new EventHandler(this.Node_Click);?如果你多次订阅,事件将会被触发相应的次数。 - Sriram Sakthivel
2个回答

2

嘿,我不太确定发生了什么,但如果你想让node_click仅应用一次,只需声明一个bool变量canEnter=true;并执行以下操作:

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

为子表单创建事件(关闭事件),并在其中添加以下内容:

canEnter = true;

如果我理解正确,这就是您需要做的事情 :)


1

由于您调用了UserControl1.MouseUp,我认为您已将事件声明为static。因此,即使您关闭第二个窗体(保持第一个窗体未关闭),事件也不会被清除。为此,您需要取消订阅该事件。

在第二个窗体中使用Form_Closing事件来取消订阅该事件。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接