Windows窗体关闭&显示方法理解

时间:2014-02-26 06:58:58

标签: c# winforms formclosing

我需要有关以下代码执行的知识。 在Form1上,我有一个按钮,它调用另一种形式Form2。

private void button1_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
obj.Show();
}

由于我使用了show方法,执行将继续&它会退出活动电话。我在Form2 FormClosing&中显示消息框FormClosed事件,但没有一个被击中。

private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("Form2 closed");
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
MessageBox.Show("Form2 closing");
}

任何原因。出于好奇,我做了这个实验&希望对此有所了解。

4 个答案:

答案 0 :(得分:1)

应该触发这两个事件,但可能没有正确附加事件处理程序。在Form_Load Form2事件中写下此代码,然后重试:

this.Form1_FormClosed += Form2_FormClosed;
this.Form1_FormClosing += Form2_FormClosing;

答案 1 :(得分:1)

由于obj未声明为全局,因此在事件处理程序终止后它将超出范围。尝试使实例全局化,即不在方法中,只调用事件处理程序中的Show方法。这应该可以解决问题。

答案 2 :(得分:1)

所以,听起来你没有订阅你的活动:

以下是您的代码的外观:

<强> Form1中

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 obj = new Form2();
        obj.Show();
    }
}

<强>窗体2

partial class Form2
{
    private System.ComponentModel.IContainer components = null;

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Name = "Form2";
        this.Text = "Form2";
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
        this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
        this.ResumeLayout(false);

    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Form2 closed.");
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        MessageBox.Show("Form2 closing.");
    }
}

也可以将它全部保存在Form1中(就订阅而言):

<强> Form1中

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 obj = new Form2();
        obj.Show();
        obj.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Form2_FormClosing);
        obj.FormClosed += new System.Windows.Forms.FormClosedEventHandler(Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Form2 closed.");
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        MessageBox.Show("Form2 closing.");
    }
}

我提供的两个版本的代码已经过测试,工作得很好。但是,你只向我们展示了三种方法,我们不知道你还在做什么,这可能会导致你的问题。学习如何调试是个好主意。例如,即使在感知的“正确”条件下,也要在未执行的代码之前设置制动点。然后,您可以单步执行代码并查看错误发生的位置。你会惊讶地发现你会抓到多少虫子。

答案 3 :(得分:1)

  

执行退出但是显示from的对象将被销毁。

啊,没有形式不会死,它会保持活着并使用包含button1的应用程序主窗体的事件循环。

  

表单出现&amp;眨眼关闭

这可能是由于其他原因造成的。您可能隐藏了表单,或者您在Form2 Load事件中有其他一些代码。表格可能会隐藏而不是关闭。