Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие при закрытие дочернего окна в MDI 
:(
    Опции темы
WinNet
Дата 6.3.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 4.3.2007
Где: г.Москва

Репутация: нет
Всего: нет



Подскажите пожалуйста какое событие генерируется в главной форме (MDI контейнере) при закрытии
дочернего окна?
PM ICQ   Вверх
-Mikle-
Дата 6.3.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



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



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
WinNet
Дата 6.3.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 4.3.2007
Где: г.Москва

Репутация: нет
Всего: нет



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

Например: после закрытия дочернего окна должен сработать метод , как грамотно обработать это событие? Можно примерчик...  smile 
PM ICQ   Вверх
-Mikle-
Дата 6.3.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Код

//..............
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 имеет бОльший смысл, чем другие события.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
WinNet
Дата 4.4.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 4.3.2007
Где: г.Москва

Репутация: нет
Всего: нет



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

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


PM ICQ   Вверх
XavierElf
Дата 5.4.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: 1
Всего: 1



А если использовать WinAPI функцию FindWindow()?

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

Вообще, насколько я знаю, с закрытием формы-родителя закрывается и все дочерние объекты данной формы... Может я вопрос не правильно понял, но звучит это примерно так, что вы хотите создавать форму №1, в ней форму №2 и форму № после этого хотите закрыть... Тогда перед закрытием может стоит поменять парента у той формы, чьего родителя хотите закрыть?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
ivashkanet
Дата 5.4.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



WinNet, вгрызайся зубами в код -Mikle- и пытайся в нем разобраться. Его идея самая, ИМХО, лучшая. Единственное что бы я изменил, это вместо AttachAsMDIChild() использовать событие MDIСhildActivate.
PM MAIL WWW ICQ   Вверх
WinNet
Дата 6.4.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 4.3.2007
Где: г.Москва

Репутация: нет
Всего: нет



Ок... в коде разобрался , работает. Но только если создается 1-на дочерняя форма.
Как быть если из 1-й дочерней формы создается еще одна (первая закрывается:Close) и только после  закрытия 2-й в родительской форме должно произойти событие? smile 
PM ICQ   Вверх
XavierElf
Дата 6.4.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: 1
Всего: 1



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

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

которое определяет существует ли ещё твоя дочерняя форма или нет и запиши в какой-нибудь обработчик проверку свойства, потом в первом дочернем когда создаёшь второе выставляй свойство IsSecondChildExists в true, а во второй дочерней форме в обработчике закрытия меняй у основной формы свойство IsSecondChildExists в false.
З.Ы. private bool? _isSecondChildExists = null; - это специальный тип bool, который может принимать значение null. Используем его для того, чтобы твоё событие не наступило раньше времени  smile 
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
WinNet
Дата 10.4.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 4.3.2007
Где: г.Москва

Репутация: нет
Всего: нет



Что то все равно не очень получается...
Вот создал 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; // если надо, то отменяем закрытие окна
}


не наступает!
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.