Как показать приглашение MessageBox, когда пользователь нажал крест в строке заголовка
В настоящее время я разрабатываю приложение Windows Form Form С#.
После входа пользователя через loginForm, он будет перенесен в mainForm.
Я хотел бы закодировать его так, чтобы после того, как пользователь щелкнул крест на строке заголовка в mainForm, появится запрос с запросом пользователя "Это закроет приложение. Подтвердите?"
затем нажмите кнопку "Да" и "Нет".
Если да, появится еще одно поле "Приложение закрыто!"
Если нет, то окно сообщения просто закроется, и приложение продолжит работу.
Мой текущий код:
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
System.Windows.Forms.Application.Exit();
}
else
{
this.Activate();
}
}
однако это не сработает.
Во-первых, я понятия не имею, почему сообщение появляется дважды, чтобы все это закрылось.
Во-вторых, если я нажимаю no, форма закрывается, и я не могу ее вернуть.
Ответы
Ответ 1
Чтобы отменить закрытие формы, в вашем заявлении else вам нужно e.Cancel = true;
.
Вам не нужен явный Exit в вашем истинном случае.
Попробуйте
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
}
else
{
e.Cancel = true;
this.Activate();
}
}
Я предполагаю, что ваш второй MessageBox сказал, что он закрыт, если только для целей тестирования.
Вы, вероятно, только хотите.
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
e.Cancel = true;
}
}
Обратите внимание, что инструкция проверяет, не ударили ли они да, а не удалили ее. Это означает, что если они попали в x в диалоговом окне, это не будет считаться подтверждением.
EDIT: Если mainForm не является основной формой
Хорошо, я думаю, что у меня есть то, что вы просите сейчас.
Что бы я сделал, это поставить код, который у меня есть в моем втором блоке кода выше в FormClosing, а затем в обработчике событий FormClosed есть этот
private void mainForm_FormClosed(Object sender, FormClosedEventArgs e)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
System.Windows.Forms.Application.Exit();
}
Ответ 2
Это поможет вам
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Are you sure you want to close?", "Close", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
e.Cancel = true;
}
Ответ 3
Вы должны посмотреть свойство Cancel в FormClosingEventArgs
:
Это должно работать:
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
}
else
{
e.Cancel = true;
}
}
http://msdn.microsoft.com/en-us/library/system.windows.forms.formclosingeventargs.aspx
Ответ 4
Это сделает то, что вам нужно:
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
}
else
{
e.Cancel = true;
}
}
Изменить:, чтобы ответить на ваш первый вопрос, см. this. Когда вы вызываете Exit()
в своем приложении, событие FormClosing
создается для всех открытых форм, включая mainForm
(который все еще открыт), поэтому событие получает два раза. Обычно я ожидал бы что-то вроде этого, чтобы привести к бесконечной рекурсии и потоку, но я полагаю, что .NET достаточно умен, чтобы предотвратить это.
В соответствующей заметке вы действительно никогда не должны закрывать свою программу, вызывая Exit()
- это своего рода запах кода.
Ответ 5
Чтобы получить желаемую функциональность, попробуйте использовать этот код:
private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
//no need to do anything here.
}
else
{
e.Cancel = true;
}
}
Ответ 6
var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel);
if (GetInput == MessageBoxResult.OK)
{
//do what you like
}
Ответ 7
ваш код отлично работает для меня без ошибок.
private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
Application.Exit();
}
else
{
this.Activate();
}
}