Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Событие при закрытие дочернего окна в MDI


Автор: WinNet 6.3.2007, 16:21
Подскажите пожалуйста какое событие генерируется в главной форме (MDI контейнере) при закрытии
дочернего окна?

Автор: -Mikle- 6.3.2007, 17:18
Насколько я знаю, вроде никакого (наверное).
Нужно при добавлении MDIChild'ов вешать на событие FormClosing и\или FormClosed один какой-то обработчик.

Автор: WinNet 6.3.2007, 21:41
Значит есть только MDIShildActivate , а событие при  закрытии порожденных окон отсутствует (или не имеет смысла быть).

Например: после закрытия дочернего окна должен сработать метод , как грамотно обработать это событие? Можно примерчик...  smile 

Автор: -Mikle- 6.3.2007, 22:15
Код

//..............
private void AttachAsMDIChild(Form mdiChild)
{
    mdiChild.MdiParent = this;
    mdiChild.Closing += new CancelEventHandler(mdiChild_Closing);
}


private void mdiChild_Closing(object sender, CancelEventArgs e)
{
    Form mdiChild = (Form)sender;
    // выполняем код перед закрытием окна
    //e.Cancel = true; // если надо, то отменяем закрытие окна
}
//..................


// используем так
Form mdiChild = new YourForm();
AttachAsMDIChild(mdiChild);


Добавлено @ 22:22 
Цитата(WinNet @  7.3.2007,  00:41 Найти цитируемый пост)
Значит есть только MDIShildActivate , а событие при  закрытии порожденных окон отсутствует (или не имеет смысла быть).

А зачем оно в принципе? Если следовать такой логике, то надо тогда продублировать все события Формы, но только называться они будут с префиксом MDI. А MDIСhildActivate имеет бОльший смысл, чем другие события.

Автор: WinNet 4.4.2007, 20:07
Уф... никак не получается! smile 
Алгоритм такой: в главной программе при нажатит на кнопка_1 создается дочерняя форма , при нажатии на кнопка_2 в дочерней форме появляется 2-рая дочерняя форма а первая дочерняя закрывается , при нажатии кнопка_3 во 2-й дочерней форме происходит ее закрытие . И тогда главная форма должна обработать это закрытие то есть выполнить определенные действия.

Пожалуйста объесните по подробней что где писать? (Работаю с книгой Троелсена но там об этом ни слова)


Автор: XavierElf 5.4.2007, 09:11
А если использовать WinAPI функцию FindWindow()?

Цитата(WinNet @  4.4.2007,  20:07 Найти цитируемый пост)
...при нажатии на кнопка_2 в дочерней форме появляется 2-рая дочерняя форма а первая дочерняя закрывается

Вообще, насколько я знаю, с закрытием формы-родителя закрывается и все дочерние объекты данной формы... Может я вопрос не правильно понял, но звучит это примерно так, что вы хотите создавать форму №1, в ней форму №2 и форму № после этого хотите закрыть... Тогда перед закрытием может стоит поменять парента у той формы, чьего родителя хотите закрыть?

Автор: ivashkanet 5.4.2007, 09:40
WinNet, вгрызайся зубами в код -Mikle- и пытайся в нем разобраться. Его идея самая, ИМХО, лучшая. Единственное что бы я изменил, это вместо AttachAsMDIChild() использовать событие MDIСhildActivate.

Автор: WinNet 6.4.2007, 17:28
Ок... в коде разобрался , работает. Но только если создается 1-на дочерняя форма.
Как быть если из 1-й дочерней формы создается еще одна (первая закрывается:Close) и только после  закрытия 2-й в родительской форме должно произойти событие? smile 

Автор: XavierElf 6.4.2007, 18:06
Хммм... Ну попробуй во второю дочернюю форму передавать ссылку на главную форму, в главной форме добавь свойство, к примеру 
Код

private bool? _isSecondChildExists = null;
public bool IsSecondChildExists
{
   get { return _isSecondChildExists; }
   set { _isSecondChildExists = value; }
}

которое определяет существует ли ещё твоя дочерняя форма или нет и запиши в какой-нибудь обработчик проверку свойства, потом в первом дочернем когда создаёшь второе выставляй свойство IsSecondChildExists в true, а во второй дочерней форме в обработчике закрытия меняй у основной формы свойство IsSecondChildExists в false.
З.Ы. private bool? _isSecondChildExists = null; - это специальный тип bool, который может принимать значение null. Используем его для того, чтобы твоё событие не наступило раньше времени  smile 

Автор: WinNet 10.4.2007, 19:56
Что то все равно не очень получается...
Вот создал 1-ю дочернюю форму как посоветовал -Mikle-  . Затем в этой дочеоней форме я создаю 2-ю
вот так 

Код

            NextMonitoring NextForm = new NextMonitoring();
            NextForm.MdiParent = AllMonitoring.ActiveForm; // ссылка на родительскую форму(MDI контейнер)
            ....................................
            NextForm.Show();
            Close(); // закрываю 1-ю дочернюю форму.


Может я здесь что то напутал? Так как при закрвтии 2-й дочерней формы(NextForm), событие

Код

private void mdiChild_Closing(object sender, CancelEventArgs e)
{
    Form mdiChild = (Form)sender;
    // выполняем код перед закрытием окна
    //e.Cancel = true; // если надо, то отменяем закрытие окна
}


не наступает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)