2009-03-30 7 views
1

Je rencontre des problèmes pour fermer une application de formulaire C# Windows. Il va juste me donner un formulaire vierge sans titre ou quoi que ce soit. Je dois trouver un moyen de fermer cette petite fenêtre inconnue.Problèmes lors de la fermeture d'un formulaire Windows C#

J'ai 2 pages de formulaire une pour un écran de connexion et une pour l'application réelle. Tout étant exécuté par un fichier program.cs.

Program.cs

... 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new PROG1()); 
} 

Ceci est juste la principale base créée par Visual Studio pour exécuter mon programme.

Ensuite, nous avons le programme principal

PROG1.cs

... 
public PROG1() 
{ 
    Login LoginForm = new Login(); 
    DialogResult a = LoginForm.ShowDialog(); 

    if(LoginForm.ValidLogin == 1) { 
     InitializeComponent(); 
    } else { 
     Application.Exit(); //FAIL 
    } 
} 

Vous pouvez voir que le premier le fichier Program.cs appelle PROG1.cs qui appelle une instance de login.cs. Si vous insérez une connexion valide, la page de connexion se fermera et le PROG1 principal s'affichera comme il se doit. Toutefois, si vous cliquez simplement sur le X rouge pour fermer le formulaire de connexion, il arrive à Prog1 et LoginForm.ValidLogin! = 1, donc il n'initialise pas le formulaire et essaiera de fermer le formulaire. Cela me laissera simplement la forme non initialisée au lieu de la fermer. Si je fais un this.close() à la place cela me donnera une erreur d'exécution.

Des idées?

Répondre

4

Mettez l'appel InitializeComponent en haut où il était auparavant. Une tentative d'utilisation de variables non initialisées, y compris en essayant de leur dire de se fermer, est une mauvaise idée.

Configurez les propriétés de votre formulaire PROG1 afin que l'état initial soit masqué et non affiché. Après le retour de LoginForm, votre code PROG1 peut décider de se montrer ou de se fermer.

1

Vous ne devriez pas faire quelque chose comme ça dans le constructeur.

Soit vous avez un nouveau formulaire d'inscription qui montre peu ou rien et présente le formulaire de connexion sur l'événement Load ou de l'événement Load sur le formulaire principal. Si vous affichez une boîte de dialogue modale, ils ne peuvent pas accéder à votre formulaire parent et vous pouvez simplement fermer le parent s'ils ne parviennent pas à se connecter.

2

La raison pour laquelle vous n'initialisez pas le formulaire en cas d'échec est-elle la raison pour laquelle le contenu de la méthode InitializeComponent() prend beaucoup de temps à s'exécuter? Il semble que vous devriez juste simplifier votre programme à ceci:

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    LoginForm login = new LoginForm(); 

    if (login.ShowDialog() == DialogResult.OK && 
     login.ValidLogin == 1) 
    Application.Run(new PROG1()); 
} 

et supprimer la logique du constructeur de PROG1.

1

Je recommanderais la meilleure pratique comme le suggère Samuel. Mais si vous voulez quelque chose de rapide, essayez de déplacer la logique de connexion pour de Visual Studio généré principal:

Dans Program.cs

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     Form2 login = new Form2(); 
     if (login.ShowDialog() == DialogResult.Yes) 
     { 
      Application.Run(new Form1()); 
     } 
    } 

Dans Form2.cs

private void button1_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.No; 
     this.Close(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     this.DialogResult = DialogResult.Yes; 
     this.Close(); 
    } 
Questions connexes