web-dev-qa-db-fra.com

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

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

Ce que j'essaie d'expliquer, c'est que si la connexion est réussie, je dois afficher le formulaire principal et fermer 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 forme principale 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 a réussi. Mais cela me dérange parce que je sais que pendant que mon programme est en cours, le formulaire de connexion est toujours là aussi, il devrait être fermé non? 

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

39
yonan2236

La raison pour laquelle votre formulaire principal ne s'affiche pas, c'est parce qu'une fois que vous fermez le formulaire de connexion, la pompe de message de votre application est arrêtée, ce qui entraîne la fermeture de l'ensemble de l'application. La boucle de messages Windows est liée au formulaire de connexion car il s'agit de celui que vous avez défini comme formulaire de démarrage dans les propriétés de votre projet. Regardez dans votre fichier "Program.cs" et vous verrez le morceau de code responsable: Application.Run(new LoginForm()). Consultez la documentation de cette méthode ici sur MSDN , ce qui explique cela plus en détail.

La meilleure solution consiste à déplacer le code de votre formulaire de connexion dans le fichier "Program.cs". Lorsque votre programme démarre pour la première fois, vous créez et affichez le formulaire de connexion sous forme de boîte de dialogue modale (qui s'exécute sur une boucle de message distincte et bloque l'exécution du reste de votre code jusqu'à sa fermeture). Lorsque la boîte de dialogue de connexion se ferme, vous allez vérifier sa propriété DialogResult pour voir si la connexion a réussi. Si c'était le cas, vous pouvez démarrer le formulaire principal à l'aide de Application.Run (créant ainsi la boucle de message principale); sinon, vous pouvez quitter l'application sans afficher de formulaire. Quelque chose comme ça:

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

Je ferais cela dans l'autre sens.

Dans l'événement OnLoad de votre formulaire principal, affichez le formulaire de connexion sous forme de boîte de dialogue. Si le résultat de la boîte de dialogue est correct, autorisez Main à poursuivre le chargement. Si le résultat est un échec d'authentification, annulez le chargement et affichez la boîte de message.

EDITéchantillon (s) de code

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 consisterait à afficher LogonForm à partir de la méthode Main dans program.cs, comme suit:

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 devrait exposer une propriété booléenne LogonSuccessful définie sur true lorsque l'utilisateur a entré des informations d'identification valides.

7
MrEyes

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();
  }
5

Ceci est ma solution. Créez ApplicationContext pour définir le formulaire principal de l'application et modifiez-le lorsque vous souhaitez ouvrir un nouveau formulaire et fermer le formulaire actuel.

Program.cs

static class Program
{
    static ApplicationContext MainContext = new ApplicationContext();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        MainContext.MainForm = new Authenticate();
        Application.Run(MainContext);
    }

    public static void SetMainForm(Form MainForm)
    {
        MainContext.MainForm = MainForm;
    }

    public static void ShowMainForm()
    {
        MainContext.MainForm.Show();
    }
}

Lorsque le processus de connexion est terminé.

private void BtLogin_Click(object sender, EventArgs e)
    {
        //Login Process Here.

        Program.SetMainForm(new Portal());
        Program.ShowMainForm();

        this.Close();
    }

J'espère que cela t'aidera.

3
MoMo

C'est la solution la plus élégante.

private void buttonLogin_Click(object sender, EventArgs e)
{
    MainForm mainForm = new MainForm();
    this.Hide();
    mainForm.ShowDialog();
    this.Close();
}

;-)

3

Voici une solution simple, votre problème est que toute votre application se ferme lorsque votre formulaire de connexion se ferme correctement? Si c'est le cas, alors allez dans les propriétés de vos projets et dans l'onglet Application, modifiez le mode d'arrêt en "Lorsque le dernier formulaire se ferme" de cette façon, vous pouvez utiliser Me.close sans fermer le programme complet

2
Miguel Gamboa
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();
    }
}
2
Mehmet
public void ShowMain()
  {
       if(auth()) // a method that returns true when the user exists.
       {        
         this.Hide();
         var main = new Main();
         main.Show();
       }
      else
       {
              MessageBox.Show("Invalid login details.");
        }         
   }
0
santan pereira

vous devriez le faire dans l'autre sens: 

Chargez d'abord le mainform et, dans son événement onload, affichez votre loginform avec showdialog(), ce qui empêchera _mainform de s'afficher jusqu'à ce que vous obteniez un résultat du loginform

EDIT: Comme il s'agit d'un formulaire login et si vous n'avez besoin d'aucune variable de votre mainform (qui est mal conçu en pratique), vous devriez vraiment le mettre en œuvre dans votre programme.cs comme suggéré par Davide et Cody.

0
Bolu

Je pense qu'une méthode bien meilleure consiste à le faire dans le fichier Program.cs où vous avez généralement Application.Run (form1). Ainsi, vous obtenez une approche plus propre, le formulaire de connexion n'a pas besoin d'être couplé au formulaire principal, affichez le login et s'il retourne vrai, vous affichez le formulaire principal sinon l'erreur.

0
Davide Piras

Evan le post est trop vieux, je voudrais vous donner une astuce pour le faire si vous voulez afficher l'écran de démarrage/connexion et lorsque la barre de progression de l'écran de démarrage obtient une certaine valeur/ou que la connexion réussie se produit et ferme le démarrage/connexion puis réafficher la forme principale, frm-main sera la forme initiale non frm-spalash

dans frm-main

public partial class frmMain : Form
{
    public frmMain()
    { 
        frmSplash frm = new frmSplash();
        frm.Show(); // new splash screen will shows
        this.Opacity=0; // will hide your main form
        InitializeComponent();
    }
 }

dans le frm-splash

private void timer1_Tick(object sender, EventArgs e)
{
 int cnt = progressBar1.Value;

    switch (cnt)
    {
        case 0:
                //Do sum stuff
            break;
        case 100:

            this.Close(); //close the frm-splash
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

            break;
    }

    progressBar1.Value = progressBar1.Value+1;
}

si vous l'utilisez pour le formulaire de connexion

private void btlogin_Click(object sender, EventArgs e)
{
 bool login = false;

    //try your login here 
    //connect your database or whatever
    //and then when it success update login variable as true

        if(login == true){

            this.Close(); //close the frm-login
            frmMain.ActiveForm.Opacity = 100; // show the frm-main

        }else{
              //inform user about failed login
        }
}

notez que j'utilise un timer et un barre de progression pour manipuler les actions dont vous n'avez pas besoin, juste pour répondre complètement, espérons que cela aide

0
Aylian Craspa

meilleur moyen de montrer la connexion et de fermer le formulaire de connexion avant la connexion avec succès, mettez le formulaire de connexion dans FrmMain après InitializeComponent.

 public FrmMain()
 {
      FrmSplash FrmSplash = new FrmSplash();
      FrmSplash.ShowDialog();

      InitializeComponent();
      //Login Section
 {
0
Ehsan Farahani

Essaye ça:

public void ShowMain()
    {
        if(auth()) // a method that returns true when the user exists.
        { 
            this.Close();
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Main));
            t.Start();
        }
        else
        {
            MessageBox.Show("Invalid login details.");
        }         
    }
   [STAThread]
   public void Main()
   {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Main());

   }

Vous devez appeler le nouveau formulaire dans un appartement de thread différent, si je ne me trompe pas, à cause du système d'appel des interfaces API et COM de Windows.

Un conseil: ce système est très peu sécurisé, car vous pouvez changer la condition if (dans MSIL) et c’est un "jeu pour enfants" pour faire passer votre sécurité. Vous avez besoin d’un système plus puissant pour sécuriser vos logiciels, comme obscurcir ou vous connecter à distance, ou quelque chose comme cela.

J'espère que cela t'aides.

0
Manuel