由于我在发布图片方面没有很高的声誉,因此我要提出一个很大的问题。

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

1. Form1 (MainForm)

在这里,我称第二个包含用户控件的窗体(SubForm)。

2. Form2 (子窗体)

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

3. Form3 (ChildForm)

它包含一个确定按钮。

这是我的问题。

  • 首先,我打开MainForm,然后单击按钮以打开第二个表单(SubForm)。
  • 现在以第二种形式(SubForm),我单击显示第三种形式(ChildForm)的用户控件。
  • 当我单击第三种形式的“确定”按钮时,该形式被关闭。
  • 现在,我关闭第二个窗体(SubForm)而不关闭第一个窗体(Main Form),然后单击第一个窗体(MainForm)中的按钮以再次打开第二个窗体(SubForm)。
  • 现在,我单击第二个窗体(SubForm)中的用户控件,然后打开第三个窗体(ChildForm)。
  • 现在,当我在第三个窗体(ChildForm)中单击“确定”时,第二个窗体(SubForm)中的事件再次被触发,第三个窗体(ChildForm)被打开了四次。
  • 现在,当我再次关闭第二个窗体(SubForm)并单击用户控件并采用第三个窗体(ChildForm)时,第三个窗体(ChildForm)被打开了3次,依此类推。

  • 这是第一种形式的代码(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();
    }
    

    有人知道为什么会这样吗?

    最佳答案

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

    使用第二种形式的Form_Closing事件对事件进行Unsubscribe

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

    10-05 19:22