我有一个非常简单的自定义UserControl,名为MyControl
在我的表单中,我有这段代码(我试着将它放入LoadEvent和costructor,在InitalizeCompoment之后):
var crl = new MyControl();
Controls.Add(ctrl);
ctrl.HandleDestroyed+=(sender,evt) => { MessageBox.Show("Destroyed") };
但是当我关闭表单时,处理程序永远不会被调用。
答案 0 :(得分:3)
如果它在主窗体上,那么我认为事件不会被调用。尝试在FormClosing
事件中处理控件以强制调用事件:
void Form1_FormClosing(object sender, FormClosingEventArgs e) {
crl.Dispose();
}
另一种方法是将FormClosing
事件添加到UserControl
:
void UserControl1_Load(object sender, EventArgs e) {
this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing);
}
void ParentForm_FormClosing(object sender, FormClosingEventArgs e) {
OnHandleDestroyed(new EventArgs());
}
或Lambda方法论:
void UserControl1_Load(object sender, EventArgs e) {
this.ParentForm.FormClosing += (s, evt) => { OnHandleDestroyed(new EventArgs()); };
}
答案 1 :(得分:2)
如果结束表单不是主表单,则调用HandleDestroyed事件。如果主窗体关闭,则应用程序将中止,事件不再触发。
我通过启动这样的应用程序进行了测试:
Form1 frmMain = new Form1();
frmMain.Show();
Application.Run();
现在关闭主窗体并不会取消该应用程序。在我这样做的形式:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
new Thread(() =>
{
Thread.Sleep(5000); // Give enough time to see the message boxes.
Application.Exit();
}).Start();
}
现在,控件上会调用HandleDestroyed和Disposed事件。
public Form1()
{
InitializeComponent();
button4.HandleDestroyed += new EventHandler(button4_HandleDestroyed);
button4.Disposed += new EventHandler(button4_Disposed);
}
void button4_Disposed(object sender, EventArgs e)
{
MessageBox.Show("Disposed");
}
void button4_HandleDestroyed(object sender, EventArgs e)
{
MessageBox.Show("HandleDestroyed");
}