我需要有关以下代码执行的知识。 在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");
}
任何原因。出于好奇,我做了这个实验&希望对此有所了解。
答案 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
事件中有其他一些代码。表格可能会隐藏而不是关闭。