2012-05-26 19 views
8

W moim projekcie są dwa formularze: Form1 i Form2. Na formularzu 1 znajduje się przycisk, a ja chcę zamknąć formularz Form1 i wyświetlić Form2 po kliknięciu tego przycisku.Jak zapobiec zamykaniu aplikacji po zamknięciu formularza startowego?

Najpierw próbowałem

Form2 frm = new Form2(); 
frm.Show(); 
this.Close(); 

ale jako Form1 został zamknięty, Form2 również został zamknięty. Następnie próbowałem

Form2 frm = new Form2(); 
frm.Show(); 
this.Hide(); 

ale nie jest wadą, że aplikacja nie zakończyć, gdy Form2 jest closed.So musiałem umieścić w dodatkowych źródeł w   sekcji form_FormClosing z Form2.

Hmm .... Zastanawiam się, czy to jest właściwa droga ... Więc jaki jest właściwy sposób radzenia sobie z tym problemem?

Odpowiedz

21

Automatycznie wygenerowany kod został napisany w Program.cs aby zakończyć działanie aplikacji, gdy okno jest zamknięte starcie. Będziesz musiał go poprawić, aby zakończył się tylko wtedy, gdy nie pozostało więcej okien. W ten sposób:

[STAThread] 
    static void Main() { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     var main = new Form1(); 
     main.FormClosed += new FormClosedEventHandler(FormClosed); 
     main.Show(); 
     Application.Run(); 
    } 

    static void FormClosed(object sender, FormClosedEventArgs e) { 
     ((Form)sender).FormClosed -= FormClosed; 
     if (Application.OpenForms.Count == 0) Application.ExitThread(); 
     else Application.OpenForms[0].FormClosed += FormClosed; 
    } 
0

Możesz wziąć ten sposób:

form2 f2=new form2() 
this.Hide(); 
f2.Show(); 

nadzieję, że był pomocny.

+0

em .. to jest to samo, co napisałem na moje pytanie. w każdym razie, dziękuję za odpowiedź – jn4kim

+0

masz formularz1 i formularz 2, kiedy naciśniesz przycisk na formularzu 1, aby otworzyć formularz2, który chcesz zamknąć formularz1, jeśli użyjesz formularza1. Ukryj(); to ukryje form1, dlaczego chcesz zamknąć formularz1? ukrywanie się nie jest dobre dla ciebie? – Shamal

2

Domyślnie pierwszy formularz kontroluje czas życia aplikacji Windows Forms. Jeśli potrzebujesz kilku niezależnych okien, twój kontekst aplikacji powinien być oddzielnym kontekstem od formularzy.

public class MyContext : ApplicationContext 
{ 
    private List<Form> forms;  

    private static MyContext context = new MyContext(); 

    private MyContext() 
    { 
     forms = new List<Form>(); 
     ShowForm1(); 
    } 

    public static void ShowForm1() 
    { 
     Form form1 = new Form1(); 
     context.AddForm(form1); 
     form1.Show(); 
    } 

    private void AddForm(Form f) 
    { 
     f.Closed += FormClosed; 
     forms.Add(f); 
    } 

    private void FormClosed(object sender, EventArgs e) 
    { 
     Form f = sender as Form; 
     if (form != null) 
      forms.Remove(f); 
     if (forms.Count == 0) 
     Application.Exit(); 
    }   
} 

Aby użyć kontekstu, należy go przekazać do Application.Run (zamiast formularza). Jeśli chcesz utworzyć kolejną Form1, zadzwoń MyContext.ShowForm1() itp

public class Program 
{ 
    public void Main() 
    { 
     Application.Run(new MyContext()); 
    } 
} 
0

Zapisz to w swojej metodzie, która jest wykonywana, gdy wystąpi zdarzenie FormClosing.

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
     // Display a MsgBox asking the user if he is sure to close 
     if(MessageBox.Show("Are you sure you want to close?", "My Application", MessageBoxButtons.YesNo) 
     == DialogResult.Yes) 
     { 
     // Cancel the Closing event from closing the form. 
     e.Cancel = false; 
     // e.Cancel = true would close the window 
     } 
} 
Powiązane problemy