2015-06-24 2 views
0

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

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

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

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

ответ

1

Я имел успех с помощью этой комбинации методов:

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, чтобы всегда знать открытые формы и делать с ними то, что вам нравится.

+0

Спасибо за этот ответ, но мне действительно нужно использовать сборку Form.MdiChildren, чтобы отслеживать открытые формы. Это единственный объект, который я могу получить все необходимые данные открытых форм. У меня нет контроля над открытием формы с помощью Form.Show(). – vpetrovic

+0

Тогда вам следовало бы объяснить это требование в деталях, потому что оно невероятно ограничительное и довольно необычное. – DonBoitnott

+0

Да, после изучения моего кода мне удалось настроить этот подход. Я использовал событие вместо защищенного метода, потому что я не могу расширять родительскую форму MDI. Спасибо. – vpetrovic

0

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

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

+0

Не из-за этого, потому что, когда я называю «форму запуска», я не могу получить текстовое значение этой формы, чтобы отображать в меню. Это сложная система, которая создает меню на основе пользовательских разрешений, а некоторые части находятся в другой dll, которую я не могу изменить. – vpetrovic

Смежные вопросы