Как получить обновленный список TabPages после события ControlRemoved? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть TabControl, к которому пользователь может добавлять / удалять TabPage с помощью двух пользовательских кнопок.Чтобы получить четкое представление, графический интерфейс выглядит следующим образом:

enter image description here

Если пользователь нажимает на значок «Плюс» (Parent являетсяВ основной форме, которая также является Parent самой TabControl), добавляется новый TabPage, содержащий пользовательский элемент управления:

TabPage indicator = new TabPage();
indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limitsTab) { Dock = DockStyle.Fill});
indicatorsTab.TabPages.Add(indicator);

Если пользователь нажимает кнопку «Удалить» внутриВ пользовательском элементе управления происходит следующее:

Parent.Dispose();

Я добавил ControlEventHandler к этому TabControl для событий ControlAdded и ControlRemoved, в которых я запускаю этот цикл:

foreach (TabPage indicator in indicatorsTab.TabPages)
{
    //stuff
}

Моя проблема заключается в следующем:

  • Когда срабатывает событие ControlAdded, я нахожу в indicatorsTab.TabPages все TabPage , включая только что добавленный - Ожидается для меня
  • Когда срабатывает событие ControlRemoved, я нахожу в indicatorsTab.TabPages все TabPage , включая только что удаленный - НЕ ЖЕЛАЛ МНЕ

Я не ожидал, что удаленная вкладка будет в indicatorsTab.TabPages после срабатывания ControlRemoved.Итак, у меня есть пара вопросов:

  1. Я ошибаюсь в своей логике?Ожидается ли, что удаленный TabPage останется в коллекции сразу после запуска события?
  2. Как получить обновленный список через TabPage s после события удаления?
  3. Не знаю почему, но я чувствую, что это расходящееся поведение есть, что увидеть в связи с тем фактом, что событие ControlAdded запускается элементом управления "братом" (потомком того же Parent, что и TabControl), в то время какControlRemoved запускается ребенком самого TabControl ... если да, кто-нибудь может объяснить, пожалуйста?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете отложить выполнение обработчика событий до тех пор, пока не будет обработано удаление:

private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
{
    BeginInvoke(new Action(() =>
    {
        MessageBox.Show(tabControl1.TabCount.ToString());
    }));
}

Показывает ожидаемый результат.

Примечание: TabControl имеет свойсвой класс ControlsCollection и в своем методе Remove он сначала удаляет элемент управления TabPage из коллекции Controls и вызывает ControlRemoved, а затем удаляет TabPage из коллекции TabPages.Таким образом, в результате в событии ControlRemoved TabPage все еще существует в коллекции TabPages, но не в коллекции Controls.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...