2010-04-21 5 views
67

В MSDN я нашел CloseReason.UserClosing, чтобы узнать, что пользователь решил закрыть форму , но я думаю, что это то же самое, что и для кнопки X, либо для нажатия кнопки закрытия. Итак, как я могу различать эти два кода?Как узнать, что пользователь нажал кнопку «X» или «Закрыть»?

Спасибо всем.

+1

который близко кнопка вы имеете в виду? –

+0

Что такое кнопка «Закрыть»? – SLaks

+0

например, закрытие «ALT + F4» – Bohn

ответ

66

Предполагая, что вы запрашиваете WinForms, вы можете использовать FormClosing() event. Событие FormClosing() запускается в любое время, когда форма закрывается.

Чтобы определить, щелкнул ли пользователь X или ваш CloseButton, вы можете получить его через объект отправителя. Попробуйте отправить отправителя как элемент управления Button и, возможно, проверьте, например, его имя «CloseButton».

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { 
    if (string.Equals((sender as Button).Name, @"CloseButton")) 
     // Do something proper to CloseButton. 
    else 
     // Then assume that X has been clicked and act accordingly. 
} 

В противном случае, я никогда никогда не нужно было различать, была ли нажата X или CloseButton, как я хотел, чтобы выполнить что-то конкретное о событии FormClosing, как закрыть все MdiChildren перед закрытием MDIContainerForm или проверки событий для несохраненных изменений , По мне, в этих условиях нам не нужно отличать ни от одной из кнопок.

Закрытие по ALT +F4 будет также инициировать событие FormClosing(), так как он посылает сообщение в форме, которая говорит, чтобы закрыть. Вы можете отменить событие, установив

FormClosingEventArgs.Cancel = true. 

В нашем примере это означало бы быть

e.Cancel = true. 

Обратите внимание на разницу между FormClosing() и FormClosed() события.

FormClosing происходит, когда форма получила сообщение, которое должно быть закрыто, и проверить, есть ли у него что-то делать до его закрытия.

FormClosed происходит, когда форма фактически закрыта, поэтому после ее закрытия.

Помогает ли это?

+0

Да, спасибо за идею «Cast», использовали эту с Delphi 7, но забыл сделать то же самое в C# – Bohn

+0

Это фактически порт от Delphi до .NET. =) Я рад, что помог! –

+0

Когда я использую этот код, я получаю ссылку на объект, не установленную на экземпляр объекта. –

69

CloseReason перечисления вы нашли на MSDN только с целью проверки закрыто ли пользователь приложения, или это было связанно с простою, или закрываются менеджером задач и т.д ...

Вы можете выполнять различные действия, по той причине, как:

void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(e.CloseReason == CloseReason.UserClosing) 
     // Prompt user to save his data 

    if(e.CloseReason == CloseReason.WindowsShutDown) 
     // Autosave and clear up ressources 
} 

Но, как вы уже догадались, что нет никакой разницы между нажатием кнопки х, или rightclicking панели задач и нажав кнопку «закрыть», или нажав AltF4 и т. Д. Все это кончается в CloseReason.UserClosing причине.

+6

Использование стандарта Close(); похоже, вызывает CloseReason.UserClosing для меня. Не знаю, почему. –

+0

Я нашел это полезным при попытке заблокировать закрытие дочерней формы MDI действием пользователя в форме, но не при закрытии родителя. –

+1

Это не отвечает на вопрос, только перечисляйте дальнейшую проблему. –

35

Кнопка «X» регистрируется как DialogResult.Cancel, поэтому другой вариант - оценить DialogResult.

Если у вас несколько кнопок на форме, вы, вероятно, уже связываете разные DialogResult s с каждым, и это даст вам возможность рассказать о разнице между каждой кнопкой.

(пример: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort)

public Form1() 
    { 
     InitializeComponent(); 

     this.FormClosing += Form1_FormClosing; 
    } 

    /// <summary> 
    /// Override the Close Form event 
    /// Do something 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Form1_FormClosing(Object sender, FormClosingEventArgs e) 
    { 
     //In case windows is trying to shut down, don't hold the process up 
     if (e.CloseReason == CloseReason.WindowsShutDown) return; 

     if (this.DialogResult == DialogResult.Cancel) 
     { 
      // Assume that X has been clicked and act accordingly. 
      // Confirm user wants to close 
      switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) 
      { 
       //Stay on this form 
       case DialogResult.No: 
        e.Cancel = true; 
        break; 
       default: 
        break; 
      } 
     } 
    } 
+0

В моем случае это более полезно, чем принятый ответ. Поскольку «X» назначается DialogResult.Cancel, присвоение некоторого другого значения кнопке отмены легко отличает их и обрабатывает вещи соответствующим образом. – mickeyf

+3

Это не работает в моем случае. Когда нажимаете 'X', 'DialogResult' остается' None'. В чем может быть проблема? – Bhaskar

+1

@Bhaskar, когда вы создаете экземпляр своего диалога, не забудьте установить соответствующий диалог DialogResult для каждой кнопки в вашем диалоговом окне. Я привел пример выше, но не создал блок кода, чтобы показать объявление Dialog. – AlexScript

1
if (this.DialogResult == DialogResult.Cancel) 
     { 

     } 
     else 
     { 
      switch (e.CloseReason) 
      { 
       case CloseReason.UserClosing: 
        e.Cancel = true; 
        break; 
      } 
     } 

если условие будет выполняться, когда пользователь нажимает кнопку 'X' или близко кнопку на форме. Другое может использоваться, когда пользователь нажимает Alt + f4 для любых других целей.

6

Определяет, когда закрыть приложение, если форма закрыта (если приложение не прикреплено к определенной форме).

private void MyForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     if (Application.OpenForms.Count == 0) Application.Exit(); 
    } 
1

Вы можете попробовать добавить обработчик событий от дизайна, как это: Открыть форму в режиме конструктора, откройте окно свойств или нажать клавишу F4, нажмите кнопку на панели инструментов событий для просмотра событий на объекте Form, найти FormClosing событие в поведении группы, и дважды щелкните по нему. Код: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral

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