it-swarm.com.de

Wie kann ich ein Anmeldeformular schließen und das Hauptformular anzeigen, ohne dass meine Anwendung geschlossen wird?

Ich habe zwei Formulare in meinem Projekt (Login und Main).

Was ich versuche zu erreichen, ist, wenn das Login erfolgreich ist, muss ich das Hauptformular anzeigen und das Login-Formular schließen.

Ich habe diese Methode im Anmeldeformular, das das Anmeldeformular schließt, wenn die Anmeldung erfolgreich ist. Aber die Hauptform zeigt sich nicht.

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.");
    }         
}

Ich habe versucht, das Anmeldeformular auszublenden, wenn der Anmeldeprozess erfolgreich ist. Aber es stört mich, weil ich weiß, dass während des Programmablaufs das Anmeldeformular noch vorhanden ist. 

Was sollte der richtige Ansatz dafür sein? Danke ...

39
yonan2236

Der Grund, warum Ihr Hauptformular nicht angezeigt wird, besteht darin, dass die Nachrichtenpumpe Ihrer Anwendung geschlossen wird, sobald Sie das Anmeldeformular schließen. Dadurch wird die gesamte Anwendung beendet. Die Windows-Meldungsschleife ist an das Anmeldeformular gebunden, da Sie dies in den Projekteigenschaften als Startformular festgelegt haben. Schauen Sie in Ihre "Program.cs" -Datei, und Sie sehen das verantwortliche Bit des Codes: Application.Run(new LoginForm()). Schauen Sie sich die Dokumentation für diese Methode hier auf MSDN an, was dies genauer erklärt.

Die beste Lösung ist, den Code aus Ihrem Anmeldeformular in die Datei "Program.cs" zu verschieben. Wenn Ihr Programm zum ersten Mal gestartet wird, erstellen und zeigen Sie das Anmeldeformular als modales Dialogfeld an (das in einer separaten Nachrichtenschleife ausgeführt wird und die Ausführung des restlichen Codes bis zum Schließen blockiert). Wenn das Anmeldedialogfeld geschlossen wird, überprüfen Sie seine DialogResult-Eigenschaft, um festzustellen, ob die Anmeldung erfolgreich war. Wenn ja, können Sie das Hauptformular mit Application.Run starten (wodurch die Hauptnachrichtenschleife erstellt wird). Andernfalls können Sie die Anwendung beenden, ohne ein Formular anzuzeigen. Etwas wie das:

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

Ich würde das andersherum machen.

Zeigen Sie im OnLoad-Ereignis für Ihr Hauptformular das Anmeldeformular als Dialogfeld an. Wenn das Dialogergebnis OK ist, lassen Sie das Laden mit Main fortsetzen. Wenn das Ergebnis ein Authentifizierungsfehler ist, brechen Sie das Laden ab und zeigen das Meldungsfeld an.

EDITCodebeispiele

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

Eine andere Lösung wäre das Anzeigen der LogonForm von der Main-Methode in program.cs, etwa wie folgt:

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

    LogonForm logon = new LogonForm();

    Application.Run(logon);

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

In diesem Beispiel müsste Ihre LogonForm eine LogonSuccessful-Bool-Eigenschaft bereitstellen, die auf true festgelegt ist, wenn der Benutzer gültige Anmeldeinformationen eingegeben hat

7
MrEyes

Es ist einfach.

Hier ist der 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

Das ist meine Lösung. Erstellen Sie ApplicationContext, um die Hauptform der Anwendung festzulegen und die Hauptform zu ändern, wenn Sie ein neues Formular öffnen und das aktuelle Formular schließen möchten.

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

Wenn der Anmeldeprozess abgeschlossen ist.

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

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

        this.Close();
    }

Ich hoffe, dies wird dir helfen.

3
MoMo

Dies ist die eleganteste Lösung.

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

;-)

Hier ist eine einfache Lösung. Ihr Problem ist, dass Ihre gesamte Anwendung geschlossen wird, wenn Ihr Anmeldeformular geschlossen wird, oder? Wenn dies der Fall ist, gehen Sie mit zu den Projekteigenschaften und ändern Sie auf der Registerkarte "Anwendung" den Modus zum Herunterfahren in "Wenn das letzte Formular geschlossen wird". So können Sie Me.close verwenden, ohne das gesamte Programm zu schließen

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

sie sollten es umgekehrt machen: 

Laden Sie zuerst die mainform und zeigen Sie in Ihrem onload-Ereignis Ihre loginform mit showdialog(). Dadurch wird verhindert, dass mainform angezeigt wird, bis Sie ein Ergebnis von loginform erhalten.

EDIT: Da dies ein login - Formular ist und Sie keine Variablen von Ihrer mainform (was in der Praxis schlechtes Design) ist, sollten Sie sie wirklich implementieren in Ihren program.cs als Davide und Cody vorgeschlagen.

0
Bolu

Ich denke, eine viel bessere Methode ist, dies in der Program.cs-Datei zu tun, in der Sie normalerweise Application.Run (form1) haben. Auf diese Weise erhalten Sie einen saubereren Ansatz. Das Anmeldeformular muss nicht mit dem Hauptformular gekoppelt werden Zeigen Sie das Login an und wenn es true zurückgibt, wird das Hauptformular angezeigt, andernfalls der Fehler.

0
Davide Piras

Evan der Post ist zu alt. Ich möchte Ihnen einen Trick vermitteln, wenn Sie den Splash-/Login-Bildschirm anzeigen möchten. Wenn die Fortschrittsleiste des Splash-Bildschirms einen bestimmten Wert erhält, wird ein erfolgreiches Login durchgeführt und das Splash/Login-Fenster geschlossen Das Hauptformular, frm-main, ist das Startformular, nicht frm-spalash

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

im 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;
}

wenn Sie es für das Anmeldeformular verwenden

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
        }
}

beachten Sie, dass ich einen Timer und einen Fortschrittsbalken verwende, um die Aktionen zu manipulieren. Sie brauchen diese beiden nicht. Nur um der vollständigen Antwort willen, hoffe das hilft

0
Aylian Craspa

der beste Weg für das Anzeigen des Anmeldeformulars und das Schließen des Anmeldeformulars vor dem Anmeldeformular Das Anmeldeformular in FrmMain nach dem InitializeComponent erfolgreich einfügen.

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

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

Versuche dies:

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

   }

Sie müssen das neue Formular in einem anderen Thread-Apartment aufrufen, wenn ich mich nicht irre, aufgrund des Aufrufsystems der Windows-API- und COM-Schnittstellen.

Ein Tipp: Dieses System ist sehr unsicher, da Sie die if-Bedingung (in MSIL) ändern können und es ist ein Kinderspiel, um Ihre Sicherheit zu schützen. Sie benötigen ein stärkeres System, um Ihre Software abzusichern, wie beispielsweise Verschleierung oder Remote-Login oder ähnliches.

Hoffe das hilft.

0
Manuel