2014-02-03 3 views
0

У меня есть приложение C#, которое имеет несколько форм. В каждой форме у меня есть кнопка «Отмена» и верхняя правая (x) кнопка. Для каждой формы, я создал cancelButton_Click(), который идет как это:Application.exit() вызывает FormClosingEvent из разных форм Windows

private void cancelButton_Click(object sender, EventArgs e) 
{ 
    Application.Exit(); 
} 

Это один вызывает функцию FormClosing, которая идет как это:

private void FormLoginPage_Closing(object sender, FormClosingEventArgs e) 
{ 
    string exitMessageText = "Are you sure you want to exit the application?"; 
    string exitCaption = "Cancel"; 
    MessageBoxButtons button = MessageBoxButtons.YesNo; 
    DialogResult res = MessageBox.Show(exitMessageText, exitCaption, button, MessageBoxIcon.Exclamation); 
    if (res == DialogResult.Yes) 
    { 
     e.Cancel = false; 

    } 
    else if (res == DialogResult.No) 
    { 
     e.Cancel = true; 
    } 
} 

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

Однако, когда я нажимаю кнопку «Отмена» для выражения Form2, элемент управления переходит к функции события Form1 Closing. Есть ли лучший способ реализовать это? Пожалуйста, предложите.

+0

Спасибо за ссылки. Я попытался использовать e.CloseReason для проверки ApplicationExit, но я не могу использовать это в каждой функции события FormClosing, так как он также будет обходить функцию FormClosing существующей формы. Пожалуйста помоги! – jetty

+0

для текущего вызова формы Закрыть, в обработчике событий 'FormLoginPage_Closing' call' Application.Exit() ' –

+0

Я сделал именно это, используя Application.Exit() в say Form2_Closing вызывает Form1_Closing, у которого снова есть messageBox для выхода из приложения. Я получаю несколько MessageBoxes, и я перехожу назад и вперед между двумя формами Закрытие событий из-за Application.Exit() – jetty

ответ

1

Создать новый класс что-то вроде

public static class ApplicationCloseHelper 
{ 
    public static void CloseApplication() 
    { 
     if (UserIsSure()) 
     { 
      Application.Exit(); 
     } 
    } 

    private static bool UserIsSure() 
    {  
     string exitMessageText = "Are you sure you want to exit the application?"; 
     string exitCaption = "Cancel"; 
     MessageBoxButtons button = MessageBoxButtons.YesNo; 
     DialogResult res = MessageBox.Show(exitMessageText, exitCaption, button, MessageBoxIcon.Exclamation); 
     return res == DialogResult.Yes; 
    } 
} 

затем удалите Form_Closing обработчики событий и вызвать

ApplicationCloseHelper.CloseApplication(); 

непосредственно из Cancel_Click();

0

Да, есть лучший способ, вы можете сделать то, что вы пытаетесь достичь, просто сделайте следующее:

private void cancelButton_Click(object sender, EventArgs e) 
{ 
    Close(); 
} 

private void FormLoginPage_Closing(object sender, FormClosingEventArgs e) 
{ 
    string exitMessageText = "Are you sure you want to exit the application?"; 
    string exitCaption = "Cancel"; 
    MessageBoxButtons button = MessageBoxButtons.YesNo; 
    DialogResult res = MessageBox.Show(exitMessageText, exitCaption, button, MessageBoxIcon.Exclamation); 
    if (res == DialogResult.Yes) 
    { 
     e.Cancel = false; 
     Application.Exit(); 
    } 
    else if (res == DialogResult.No) 
    { 
     e.Cancel = true; 
    } 

} 

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

+0

IsClosing должен быть доступен по всему миру, например Program.IsClosing static bool –

+0

да, простите, я несколько раз пересмотрел свой ответ - был смущен WPF .. теперь это хорошо :) –

+0

Я знаю, я пытаюсь сохранить свой комментарий до дате с вашим ответом :) В настоящее время только закрытие текущей формы, если форма не является основной формой приложения –

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