it-swarm.com.ru

Какое событие сигнализирует о том, что UserControl уничтожается?

У меня есть элемент управления, полученный из UserControl, отображает некоторую информацию, полученную с веб-сервера. В настоящее время я делаю инициализацию элемента управления асинхронной, чтобы улучшить отзывчивость.

В моем обработчике события Load я создаю CancellationTokenSource и использую связанный токен в различных асинхронных вызовах.

Теперь я хочу убедиться, что если пользователь закроет форму до завершения асинхронной операции, операция будет отменена. Другими словами, я хочу вызвать Cancel на токене.

Я пытаюсь выяснить где сделать это. Если бы было событие Unload, которое я мог бы перехватить, то это было бы идеально, но это не так. На самом деле, я не могу найти событие, которое выглядит подходящим.

Я мог перехватывать событие закрытия для содержащей Формы, но я действительно хотел сохранить все локально для моего UserControl.

Предложения?

35
Gary McGill

Я предлагаю Control :: HandleDestroyed событие. Он вызывается, когда базовый HWnd уничтожается (что обычно происходит, когда родительская форма закрыта). Чтобы обработать это в вашем собственном UserControl, вы должны переопределить OnHandleDestroyed .

В настоящий момент у вас есть полный доступ к свойствам элемента управления, поскольку он еще не удален.

36
Stephan

Другое решение

    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);

        if (parentForm != null)
        {
            parentForm.Closing -= parentForm_Closing;
        }
        parentForm = FindForm();

        if (parentForm != null)
            parentForm.Closing += parentForm_Closing;
    }

    void parentForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        parentForm.Closing -= parentForm_Closing;
        parentForm = null;
        //closing code
    }
11
Avram

Почему бы просто не использовать событие Disposed ?

Когда форма закрывается, она вызывает саму себя Dispose, и все дочерние элементы управления также будут рекурсивно расположены.

1
sloth

Попробуй это:

UserControl.Dispose();
0
Gimhan