2011-12-03 16 views
7

Problem polega na tym, że w polu wiadomości "jesteś pewien, że chcesz zamknąć?" wyskakuje, ale kiedy klikam "nie", nadal przystępuje do zamykania programu. Jakieś sugestie? Oto mój kod:Pytanie o potwierdzenie po kliknięciu przycisku "X"

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     CloseCancel(); 
    } 

    public static void CloseCancel() 
    { 
     const string message = "Are you sure that you would like to cancel the installer?"; 
     const string caption = "Cancel Installer"; 
     var result = MessageBox.Show(message, caption, 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Question); 

     if (result == DialogResult.Yes) 
      Environment.Exit(0); 
    } 

Odpowiedz

20

Oczekuje się, że można ustawić właściwość FormClosingEventArgs argumentu Cancel do true gdy wymagają Bliskie operację zostać anulowane. Nie jest wymagane jawne,, ponieważ nie jest to wymagane, ponieważ forma jest na drodze do zamknięcia w dowolny sposób (anulowanie procesu zamykania jest opcjonalne, a nie rezygnacja).

Wymień ostatni kawałek z:

var result = MessageBox.Show(message, caption, 
          MessageBoxButtons.YesNo, 
          MessageBoxIcon.Question); 

e.Cancel = (result == DialogResult.No); 
6

e.Cancel na razie FormClosing zatrzyma procesu zamykania

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (CloseCancel()==false) 
     { 
      e.Cancel = true; 
     }; 
    } 

    public static bool CloseCancel() 
    { 
     const string message = "Are you sure that you would like to cancel the installer?"; 
     const string caption = "Cancel Installer"; 
     var result = MessageBox.Show(message, caption, 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Question); 

     if (result == DialogResult.Yes) 
      return true; 
     else 
      return false; 
    } 
1
protected Boolean CanClose(Boolean CanIt) 
{ 
    if(MessageBox.Show("Wanna close?", "Cancel Installer", MessageBoxButtons.YesNo,  MessageBoxIcon.Question).ShowDialog() == DialogResult.Yes) 
    { 
     // Yes, they want to close. 
     CanIt = true; 
    } 
    else 
    { 
    // No, they don't want to close. 
    CanIt = false; 
    } 

    return CanIt; 
} 

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if(CanClose(false) == true) 
    { 
     this.Dispose(true); 
    } 
    else 
    { 
     e.Cancel = true; 
    } 
} 

jestem pewien, w jaki sposób poradzić sobie z innego scenariusza wspomniałeś (obsługujesz kliknięcie "X"). Być może można zrobić coś takiego (psuedo-kod):

// IF CLICKED YES 
    THEN CLOSE 
// ELSE-IF CLICKED NO 
    THEN DO NOTHING 
// ELSE 
    THEN DO NOTHING 
+0

To jest to, ale przesadzasz. Dlaczego 'CanClose (false)', a nie 'CanClose()'? – Otiel

+0

dobrze wypróbowany, nie potrzebujesz argumentu w metodzie CanClose(), gratulacje za pierwszą odpowiedź –

2

prostu wziąć to proste

protected override void OnFormClosing(FormClosingEventArgs e) 
     {    
      base.OnFormClosing(e); 
      if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes) 
      { 
       Dispose(true); 
       Application.Exit(); 
      } 
      else 
      { 
       e.Cancel = true; 
      } 
     } 

     private DialogResult PreClosingConfirmation() 
     { 
      DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?   ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
      return res; 
     } 
0

Pytanie jest teraz stary, ale w ten sposób jest bardziej prosty i krótki, i myślę, że mogę być przydatne dla tych, którzy przybywają na tej stronie:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if (MessageBox.Show("Are you sure that you would like to cancel the installer?", "Cancel Installer", MessageBoxButtons.YesNo) == DialogResult.No) 
    { 
     e.Cancel = true; 
    } 
} 

i wykorzystać gdzie indziej this.Close() zamiast funkcji.

Powiązane problemy