Задача - определить разные источники действий пользователя, которые приводят к закрытию формы. Например, пользователь может кликнуть на стандартной кнопке с крестиком X (которая находится в правом верхнем углу окна, на плашке), либо он может кликнуть на отдельной кнопке пользователя, обработчик которой закрывает форму.
[Событие FormClosing]
Если используются WinForms, то можно использовать событие FormClosing(). Оно срабатывает всякий раз, когда форма закрывается. Чтобы детектировать действие пользователя, когда он кликнул либо на стандартной кнопке X либо на Вашей кнопке CloseButton, можно получить информацию через объект sender. Попробуйте привести тип источника события (cast sender) как управляющий элемент кнопки (Button control), и проверьте эго имя - к примеру, равно ли оно "CloseButton".
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (string.Equals((sender as Button).Name, @"CloseButton"))
{
// Действия, соответствующие CloseButton.
...
}
else
{
// Другие действия, которые приводят к закрытию формы.
// Предположительно пользователь кликнул на кнопку 'X'.
...
}
}
Закрытие формы комбинацией клавиш ALT+F4 также приведет к вызову события FormClosing(), поскольку это связано с отправкой сообщения закрытия для формы. Вы можете отменить действие события закрытия формы, если присвоите FormClosingEventArgs.Cancel = true.
Для нашего примера достаточно вставить в обработчик Form1_FormClosing следующий код:
Обратите внимание на различие между событиями FormClosing() и the FormClosed(). FormClosing происходит, когда форма приняла сообщение для закрытия, и в обработчике FormClosing можно выполнить некоторые действия, которые произойдут перед закрытием формы и уничтожением его экземпляра класса (в частности, можно отменить закрытие формы, как мы сделали в предыдущем примере). Событие FormClosed происходит, когда форма по-настоящему закрыта, т. е. здесь можно выполнить действия, которые произойдут после закрытия формы.
[CloseReason]
Перечисление CloseReason, описание которого можно найти в MSDN, позволяет определить, каким образом пользователем было закрыто приложение - либо при выключении компьютера, либо через Диспетчер Задач (task manager), и т. д. Чтобы дифференцировать друг от друга причины закрытия, можно использовать примерно такой код:
void Form_FormClosing(object sender, FormClosingEventArgs e)
{
if(e.CloseReason == CloseReason.UserClosing)
{
// Приложение закрыл пользователь, можно предложить ему сохранить данные
...
}
if(e.CloseReason == CloseReason.WindowsShutDown)
{
// Автосохранение и очистка ресурсов
...
}
}
Однако в этом коде нет различий между кликом на кнопке x, правым кликом на плашке и выбором в контекстном меню "Закрыть", нажатием Alt+F4, и т. п. Все это действия пользователя, так что они будут соответствовать CloseReason.UserClosing.
[DialogResult]
Кнопка "X" соответствует DialogResult.Cancel, так что это дополнительная возможность оценки результата закрытия диалога. Если на форме есть несколько кнопок, то возможно Вы можете захотеть связать разные DialogResult с каждой, и это даст дополнительную информацию для того, чтобы отличать кнопки друг от друга. Например: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort, и т. п.
public Form1()
{
InitializeComponent();
this.FormClosing += Form1_FormClosing;
}
/// < summary >
/// Переопределение события Close для формы
/// < /summary >
/// < param name="sender" >< /param >
/// < param name="e" >< /param >
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
//В случае, когда Windows завершает работу, мы не будем управлять процессом:
if (e.CloseReason == CloseReason.WindowsShutDown)
return;
if (this.DialogResult == DialogResult.Cancel)
{
// Предположим, что кликнули на X, и выполним соответствующие действия.
// Выдача запроса подтверждения пользователю:
switch (MessageBox.Show(this, "Вы уверены?",
"Действительно хотите ... ?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question))
{
case DialogResult.No:
// Остаемся в этой форме
e.Cancel = true;
break;
default:
break;
}
}
}
[Ссылки]
1. How to know user has clicked X or the Close button site:stackoverflow.com. |