Обновление списка дочерних форм MDI после закрытия формы

Я использую DevExpress NavBar в качестве главного меню для моего приложения MDI, и одна из групп NavBar содержит элементы, которые представляют открытые дочерние формы MDI. У меня возникают проблемы с обновлением меню при закрытии дочерней формы MDI.

Мне нужно использовать коллекцию Form.MdiChildren для создания группы меню, но проблема в том, что при использовании события Form.FormClosing эта закрытая форма все еще находится в коллекции Form.MdiChildren. Я попытался использовать System.Timers.Timer, чтобы подождать 1 секунду, а затем обновить меню, но я получаю различные исключения из-за асинхронного поведения (когда пользователь очень быстро закрывает несколько форм).

Я также не могу вести свой собственный список дочерних элементов MDI из-за сложности дизайна классов.

Есть ли у кого-нибудь изящное решение для этого?


person vpetrovic    schedule 24.06.2015    source источник


Ответы (2)


Мне удалось использовать эту комбинацию методов:

private List<Form> _childForms = new List<Form>();

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

   Form form = ActiveMdiChild;
   if (form == null)
       return;
   else
   {
       if (!_childForms.Contains(form))
       {
           _childForms.Add(form);
           form.FormClosed += mdiChildForm_FormClosed;
       }
   }
}

private void mdiChildForm_FormClosed(Object sender, FormClosedEventArgs e)
{
   var form = (Form)sender;
   if (_childForms.Contains(form))
       _childForms.Remove(form);
   if (_childForms.Count > 0)
       _childForms[_childForms.Count - 1].Activate();
}

Обратите внимание, что метод Activate вызывается практически всегда, когда пользователь взаимодействует с дочерней формой. Это включает их открытие и закрытие.

Затем вы можете использовать коллекцию childForms, чтобы всегда знать открытые формы и делать с ними то, что вам нравится.

person DonBoitnott    schedule 24.06.2015
comment
Спасибо за этот ответ, но мне действительно нужно использовать коллекцию Form.MdiChildren, чтобы отслеживать открытые формы. Это единственный объект, с которого я могу получить все необходимые данные открытых форм. Я не могу открыть форму с помощью Form.Show (). - person vpetrovic; 24.06.2015
comment
В таком случае вам следует пояснить это требование более подробно, поскольку оно чрезвычайно ограничительно и весьма необычно. - person DonBoitnott; 24.06.2015
comment
Да, после более подробного изучения моего кода мне удалось скорректировать этот подход. Я просто использовал событие вместо защищенного метода, потому что я не могу расширить родительскую форму MDI. Спасибо. - person vpetrovic; 25.06.2015

«Я также не могу вести свой собственный список дочерних элементов MDI из-за сложности дизайна классов».

Это из-за разных типов классов? А как насчет того, чтобы держать список базовых классов? например: List<Form> Когда есть FormClosed событие, просто удалите эту форму из списка.

person Jeroen van Langen    schedule 24.06.2015
comment
Не из-за этого, это потому, что когда я вызываю форму запуска, я не могу получить текстовое значение этой формы для отображения в меню. Это сложная система, которая генерирует меню на основе прав пользователя, а некоторые части находятся в другой dll, которую я не могу изменить. - person vpetrovic; 24.06.2015