В MSDN я нашел CloseReason.UserClosing
, чтобы узнать, что пользователь решил закрыть форму
но я думаю, что это одно и то же для нажатия кнопки X или нажатия кнопки закрытия.
Итак, как я могу различать эти два в моем коде?
Спасибо всем.
В MSDN я нашел CloseReason.UserClosing
, чтобы узнать, что пользователь решил закрыть форму
но я думаю, что это одно и то же для нажатия кнопки X или нажатия кнопки закрытия.
Итак, как я могу различать эти два в моем коде?
Спасибо всем.
Предполагая, что вы запрашиваете WinForms, вы можете использовать событие FormClosing(). Событие 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 возникает, когда форма фактически закрыта, поэтому после ее закрытия.
Помогает ли это?
Перечисление 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
}
Но, как вы уже догадались, нет никакой разницы между нажатием кнопки x или правым щелчком панели задач и нажатием "закрыть" или нажатием Alt F4 и т.д. Все это заканчивается на CloseReason.UserClosing
.
Кнопка "X" регистрируется как DialogResult.Cancel
, поэтому другой параметр должен оценить DialogResult
.
Если у вас несколько кнопок в форме, вы, вероятно, уже связываете разные DialogResult
с каждым, и это даст вам возможность рассказать разницу между каждой кнопкой.
(Пример: 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;
}
}
}
Определяет, когда закрыть приложение, если форма закрыта (если ваше приложение не привязано к определенной форме).
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
if (Application.OpenForms.Count == 0) Application.Exit();
}
Я всегда использую метод Form Close в моих приложениях, который ловит alt + x из моей кнопки выхода, alt + f4 или другого события закрытия формы. Все мои классы имеют имя класса, определенное как Private string mstrClstitle= "grmRexcel"
в этом случае, метод Exit, который вызывает метод закрывания формы и метод закрытия формы. У меня также есть инструкция для метода закрытия формы - this.FormClosing = My Form Closing Form Closing method name
.
Код для этого:
namespace Rexcel_II
{
public partial class frmRexcel : Form
{
private string mstrClsTitle = "frmRexcel";
public frmRexcel()
{
InitializeComponent();
this.FormClosing += frmRexcel_FormClosing;
}
/// <summary>
/// Handles the Button Exit Event executed by the Exit Button Click
/// or Alt + x
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
/// <summary>
/// Handles the Form Closing event
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmRexcel_FormClosing(object sender, FormClosingEventArgs e)
{
// ---- If windows is shutting down,
// ---- I don't want to hold up the process
if (e.CloseReason == CloseReason.WindowsShutDown) return;
{
// ---- Ok, Windows is not shutting down so
// ---- either btnExit or Alt + x or Alt + f4 has been clicked or
// ---- another form closing event was intiated
// *) Confirm user wants to close the application
switch (MessageBox.Show(this,
"Are you sure you want to close the Application?",
mstrClsTitle + ".frmRexcel_FormClosing",
MessageBoxButtons.YesNo, MessageBoxIcon.Question))
{
// ---- *) if No keep the application alive
//---- *) else close the application
case DialogResult.No:
e.Cancel = true;
break;
default:
break;
}
}
}
}
}
Вы можете попробовать добавить обработчик событий из проекта следующим образом: Открыть форму в окне дизайна, открыть окно свойств или нажать F4, нажать кнопку панели событий событий, чтобы просмотреть события в объекте Form, найти событие FormClosing в группе Behavior и дважды щелкнуть по нему. Ссылка: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral
if (this.DialogResult == DialogResult.Cancel)
{
}
else
{
switch (e.CloseReason)
{
case CloseReason.UserClosing:
e.Cancel = true;
break;
}
}
если условие будет выполняться, когда пользователь нажимает кнопку "X" или кнопку закрытия в форме. Другое может использоваться, когда пользователь нажимает Alt + f4 для любых других целей
namespace Test
{
public partial class Member : Form
{
public Member()
{
InitializeComponent();
}
private bool xClicked = true;
private void btnClose_Click(object sender, EventArgs e)
{
xClicked = false;
Close();
}
private void Member_FormClosing(object sender, FormClosingEventArgs e)
{
if (xClicked)
{
// user click the X
}
else
{
// user click the close button
}
}
}
}