Событие HandleDestroyed в userControl - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть очень простой пользовательский UserControl, названный MyControl

В моей форме у меня есть этот код (я пытался поместить его в LoadEvent и конструктор после InitalizeCompoment):

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

Но когда я закрываю, обработчик формы никогда не вызывается.

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Если это в главной форме, то я не думаю, что событие вызывается. Попробуйте использовать элемент управления в событии 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());
}

или в методике лямбда:

void UserControl1_Load(object sender, EventArgs e) {
  this.ParentForm.FormClosing += (s, evt) => { OnHandleDestroyed(new EventArgs()); };
}
2 голосов
/ 28 декабря 2011

Событие 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...