userControl中的HandleDestroyed事件

时间:2011-12-28 15:36:50

标签: c# winforms

我有一个非常简单的自定义UserControl,名为MyControl

在我的表单中,我有这段代码(我试着将它放入LoadEvent和costructor,在InitalizeCompoment之后):

var crl = new MyControl();
Controls.Add(ctrl);
ctrl.HandleDestroyed+=(sender,evt) => { MessageBox.Show("Destroyed") };

但是当我关闭表单时,处理程序永远不会被调用。

2 个答案:

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