Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

    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
    }

Ответ 3

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

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

Ответ 4

Попробуйте следующее:

UserControl.Dispose();