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


Автор: DEER 15.8.2006, 09:58
Что то нигде не нашел как это сделать.

Хочу до начала закрытия окна, спросить у юзера о сохранинии, 
ставил код в деструктор, но он срабатывает когда уже окно закрылось, и если юзер нажмет Cancel, то никак не получается отменить закрытие окна.

Есть ли событие, которое возникает до начала закрытия формы, или хотя бы во время закрытия ??

Добавлено @ 10:05 
так..
у формы оказывается есть событие closing..
тогда все просто....
а вот если это не форма, а UserControl?? тогда никак не отловишь закрытие?

Автор: ivashkanet 15.8.2006, 10:16
Тебе нужно событие Form.Closing. И поле его аргумента e.Cancel 
Незакрываемая форма (как ни странно (шутка smile ) не закрывается)
Код

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
      e.Cancel = true;
}


Автор: DEER 15.8.2006, 10:25
да, спасибо, с этим разобрался...
а с контролом. 
Получается, нужно делать публичный метод у контрола, который и будет спрашивать у юзера... и если нажали Cancel, то метод вернёт false, тогда в форме пишем
Код

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if(!MyControl.Closing())  e.Cancel = true;
}


Автор: mr.DUDA 15.8.2006, 10:31
Цитата(DEER @  15.8.2006,  09:58 Найти цитируемый пост)
а вот если это не форма, а UserControl?? тогда никак не отловишь закрытие?

А как ты себе представляешь "закрытие юзерконтрола" ?  smile 

Если нужно отловить закрытие формы с юзерконтрола, можно например поступить так: добавить свой public-метод OnClosing(CancelEventArgs e), который вызывать с формы в обработчике Form.Closing (форма уже знает о наличии этого метода). Пусть OnClosing у юзерконтрола выполняет все действия, связанные с закрытием родительской формы, и выставляет e.Cancel = true если форму закрывать нельзя.

Добавлено @ 10:32 
Цитата(DEER @  15.8.2006,  10:25 Найти цитируемый пост)
Получается, нужно делать публичный метод у контрола, который и будет спрашивать у юзера... и если нажали Cancel, то метод вернёт false, тогда в форме пишем

опередил  smile 

Автор: arilou 15.8.2006, 22:59
А что, разве из ЮзерКонтрола нельзя подписаться на Form.Closing ?  smile 

Автор: mr.DUDA 16.8.2006, 09:19
Цитата(arilou @  15.8.2006,  22:59 Найти цитируемый пост)
А что, разве из ЮзерКонтрола нельзя подписаться на Form.Closing ?

Можно, хоть его IntelliSence и не показывает smile. Событие в 2.0 стало obsolete, подписываться надо на событие FormClosing. Но тут есть ряд мелких неприятностей:
- во-первых, нужно найти форму (не факт, что контрол находится на форме, а не внутри др. контрола), методом FindForm()
- во-вторых, делать это можно только начиная с метода OnLoad (в конструкторе нельзя, т.к. контрол ещё не добавлен на форму)
- в Design Mode формы может не быть, значит нужна проверка на null

Конечно, правильнее подписываться на событие, но проще объявить паблик-метод и дёргать его из формы.  smile 

Автор: engaged 22.4.2008, 21:28
а на Delphi можно ли отменить закрытие окна?

Автор: amarenkov 23.4.2008, 08:26
И на Delphi можно:

Код

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Action := caNone;
end;

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