44 votes

Comment puis-je fermer un formulaire de connexion et afficher le formulaire principal sans fermer ma candidature?

J'ai deux formulaires dans mon projet (le Login et le Principal).

Ce que j'essaie de accoomplish est, si la connexion est réussie, je dois montrer le formulaire Principal et fermez le formulaire de Connexion.

J'ai cette méthode dans le formulaire de Connexion qui ferme le formulaire de Connexion lorsque la connexion est réussie. Mais la Principale forme ne montre pas.

public void ShowMain()
{
    if(auth()) // a method that returns true when the user exists.
    {             
        var main = new Main();
        main.Show();
        this.Close();
    }
    else
    {
        MessageBox.Show("Invalid login details.");
    }         
}

J'ai essayé de cacher le formulaire de Connexion si le processus de connexion est réussie. Mais ça me dérange parce que je sais bien que mon programme est en cours d'exécution le formulaire de connexion est toujours là, elle devrait être fermée à droite?

Quelle devrait être la bonne approche pour cela? Merci...

112voto

Cody Gray Points 102261

La raison principale de votre formulaire n'est pas de montrer, c'est parce que une fois que vous fermez le formulaire de connexion, votre message l'application de la pompe est à l'arrêt, ce qui provoque la totalité de la demande pour quitter. Le message de Windows boucle est lié au formulaire de connexion, car c'est celui que vous avez défini comme le formulaire de démarrage dans votre projet de propriétés. Regardez dans votre Programme".cs" du fichier, et vous verrez le responsable bits de code: Application.Run(new LoginForm()). Consultez la documentation de la méthode ici sur MSDN, ce qui explique cela plus en détail.

La meilleure solution est de déplacer le code de votre formulaire de connexion dans le "Programme.cs de fichier". Lorsque votre programme démarre pour la première fois, vous allez créer et afficher le formulaire de connexion comme une boîte de dialogue modale (qui s'exécute sur un autre message en boucle et bloque l'exécution du reste de votre code jusqu'à ce qu'elle se ferme). Lorsque la boîte de dialogue de connexion se ferme, vous pourrez vérifier sa DialogResult de la propriété pour voir si la connexion a réussi. Si elle l'est, vous pouvez commencer la principale forme à l'aide de Application.Run (créant ainsi le principal message boucle); sinon, vous pouvez quitter l'application sans montrer une quelconque forme. Quelque chose comme ceci:

static void Main()
{
    LoginForm fLogin = new LoginForm();
    if (fLogin.ShowDialog() == DialogResult.OK)
    {
        Application.Run(new MainForm());
    }
    else
    {
        Application.Exit();
    }
}

11voto

MrEyes Points 3571

Je voudrais faire l'inverse.

Dans l'événement OnLoad de votre formulaire Principal afficher le formulaire d'ouverture de session en tant que boîte de dialogue. Si la boîte de dialogue résultat est OK, alors autoriser la main pour continuer le chargement, si le résultat est un échec d'authentification alors abandonner le charger et afficher la boîte de message.

MODIFIER le Code de l'échantillon(s)

private void MainForm_Load(object sender, EventArgs e)
{
    this.Hide();

    LogonForm logon = new LogonForm();

    if (logon.ShowDialog() != DialogResult.OK)
    {
        //Handle authentication failures as necessary, for example:
        Application.Exit();
    }
    else
    {
        this.Show();
    }
}

Une autre solution serait d'afficher la LogonForm de la méthode Principale dans le programme.cs, quelque chose comme ceci:

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

    LogonForm logon = new LogonForm();

    Application.Run(logon);

    if (logon.LogonSuccessful)
    {
        Application.Run(new MainForm());
    }
}

Dans cet exemple, votre LogonForm aurait pour exposer une LogonSuccessful bool propriété est définie sur true si l'utilisateur a entré des informations d'identification valides

5voto

C'est simple.

Voici le code.

  private void button1_Click(object sender, EventArgs e)
 {  
        //creating instance of main form
        MainForm mainForm = new MainForm();

        // creating event handler to catch the main form closed event
        // this will fire when mainForm closed
        mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed);
        //showing the main form
        mainForm.Show();
        //hiding the current form
        this.Hide();
  }

  // this is the method block executes when main form is closed
  void mainForm_FormClosed(object sender, FormClosedEventArgs e)
  {
       // here you can do anything

       // we will close the application
       Application.Exit();
  }
 

2voto

Miguel Gamboa Points 21

Voici une solution simple, votre problème est que toute votre application se ferme lorsque votre formulaire de connexion se ferme correctement? Si tel est le cas, accédez aux propriétés de votre projet et, dans l'onglet Application, définissez le mode d'arrêt sur "Lorsque le dernier formulaire se ferme" pour que vous puissiez utiliser Me.close sans fermer l'ensemble du programme.

2voto

Mehmet Points 11
static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Login();
    } 

    private static bool logOut;

    private static void Login()
    {
        LoginForm login = new LoginForm();
        MainForm main = new MainForm();
        main.FormClosed += new FormClosedEventHandler(main_FormClosed);
        if (login.ShowDialog(main) == DialogResult.OK)
        {
            Application.Run(main);
            if (logOut)
                Login();
        }
        else
            Application.Exit();
    }

    static void main_FormClosed(object sender, FormClosedEventArgs e)
    {
        logOut= (sender as MainForm).logOut;
    }
}

public partial class MainForm : Form
{
    private void btnLogout_ItemClick(object sender, ItemClickEventArgs e)
    {
        //timer1.Stop();
        this.logOut= true;
        this.Close();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X