-3

我需要有关以下代码执行的知识。在 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

4 回答 4

1

这两个事件都应该被触发,但可能你没有正确附加事件处理程序。在你的 Form_Load事件中写下这段代码,Form2然后再试一次:

this.Form1_FormClosed += Form2_FormClosed;
this.Form1_FormClosing += Form2_FormClosing;
于 2014-02-26T07:03:51.280 回答
1

由于obj未声明为全局,因此在事件处理程序终止后它将超出范围。尝试使实例全局化,即不在方法中,并且只Show在事件处理程序中调用方法。这应该够了吧。

于 2014-02-26T07:04:05.603 回答
1

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

这是您的代码的外观:

表格1

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 中(就订阅而言):

表格1

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.");
    }
}

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

于 2014-02-26T07:08:28.467 回答
1

执行退出,但显示 from 的对象将被销毁,因为它的范围。

啊,表单不会死,它会保持活动状态并使用包含button1.

表格出现并闪烁关闭

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

于 2014-02-26T07:25:44.777 回答