C # WinForms TabControl Удалить вкладку и закрыть дочерние элементы управления - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть родительский контейнер (форма), который инициализирует новую вкладку TabPage с пользовательским элементом управления внутри нее (вызывается из полосы меню). Элемент управления вкладки имеет контекстное меню, которое, когда вы щелкаете правой кнопкой мыши и выбираете «Закрыть выбранную вкладку», я вызываю метод, который удаляет эту вкладку. Однако это не останавливает выполнение кода в пользовательском элементе управления TabPage. Как я могу это очистить, чтобы при закрытии вкладки (TabPages.Remove ... и т. Д.) Она также закрывала пользовательский элемент управления в этой вкладке, так что любой фоновый код прекращал выполняться?

Код ниже закрывает вкладку: Последняя часть просто выбирает следующую вкладку слева после удаления вкладки.

       public static void closeCurrentTab(TabControl tc)
    {
        int curTabIndex = tc.SelectedIndex;
        TabPage tp = tc.SelectedTab;
        tc.TabPages.Remove(tp);
        if(curTabIndex > 0)
        {
            tc.SelectedTab = tc.TabPages[(curTabIndex - 1)];
        }       
    }

1 Ответ

0 голосов
/ 16 ноября 2018

Я нашел проблему. Я обнаружил, что асинхронные процессы в дочернем элементе управления сбились с пути даже после удаления родительского элемента управления (в данном случае это TabPage).

Простой пример того, как я решил, приведен ниже.

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

используя this.Parent и проверяя, является ли оно нулевым или нет, если бы ему нравилось.

        protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);
        if(this.Parent == null)
        {
        // Clean up

        }
    }

и \ или это

 private async Task popUp()
    {
        do
        {
            MessageBox.Show("Im running!");
            await Task.Delay(5000);
        }
        while (this.Parent != null);
    }
...