2012-01-23 8 views
8

Nel mio programma mi mostra un modulo di accesso prima che il modulo principale, una volta che il programma rileva un login riuscito io uso questo:C# Apertura di una nuova forma e chiudendo l'altra

MainForm Main = new MainForm(); 
Main.Show(); 
this.Hide(); 

Questo funziona bene, ma non v'è un problema, il modulo di login è ancora aperto anche se è nascosto così quando il programma è chiuso il processo si blocca ancora, come posso evitare che ciò accada?

Spiacente, ho dimenticato di aggiungere, utilizzando this.Close(); non funziona e si chiuderà completamente il programma.

+0

provare this.close() –

risposta

8

È necessario specificare il MainForm quando si applica l'applicazione e nel gestore di eventi Load di questo modulo per richiedere l'accesso. In questo caso avrete runned applicazione e Login per il di partenza:

Program.cs

Application.Run(new MainForm()); 

MainForm.cs

private void Form1_Load(object sender, EventArgs e) 
    { 
     LoginForm loginForm = new LoginForm(); 
     if (loginForm.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      // check login here 
     } 
    } 

P.S. Close chiuderà la tua applicazione in modo completo se è la forma principale della tua applicazione.

+1

Se si nasconde MainForm nel suo carico prima di mostrare il modulo di accesso, replicherete più da vicino la funzionalità dell'utente prima di aprire il modulo di accesso. – Servy

-1

Come su this.Close()?

1

Modificare il modulo principale in MainForm e all'avvio dell'applicazione, nel modulo di accesso MainForm_Load come finestra di dialogo, in modo che non possano accedere al modulo principale.

  • Se avete bisogno di essere in grado di chiudere l'applicazione dal modulo di login, utilizzare Application.Exit(0);
  • Se non si desidera loro di vedere il modulo di ricerca principale e sovrascrivere SetVisibilityCore e chiamarlo all'internoMainForm_Load.
10

Provare qualcosa di più simile a questo:

this.Hide(); 
Main.ShowDialog(); 
this.Close(); 

Si vuole nascondere il form di login prima di mostrare la finestra di dialogo, quindi chiudere il modulo di accesso dopo la finestra è stata chiusa.

Basta chiudere la finestra di dialogo di accesso per terminare l'applicazione, quindi non è una soluzione reale, ma si desidera comunque nascondere l'accesso.

In poche parole, metti le cose nell'ordine in cui vuoi che entrino, specialmente quando si tratta di loop di messaggi.

In primo luogo, si nasconde il modulo di accesso.
Successivamente, viene visualizzata la finestra di dialogo Modulo principale, ma impedisce al chiamante di "ShowDialog()" di continuare fino alla chiusura della finestra di dialogo.
Infine, una volta chiusa la finestra di dialogo, si chiude il modulo di accesso, terminando l'applicazione.

1

È possibile utilizzare ApplicationContext.MainForm per specificare principale forma di corrente per l'applicazione:

static class Program 
{ 
    public static ApplicationContext Context { get; set; } 

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

     Context = new ApplicationContext(new LoginForm()); 
     // pass Context instead of just new LoginForm() 
     Application.Run(Context); 
    } 
} 

poi nel gestore login:

private void login_Click(object sender, EventArgs e) 
{ 
    Program.Context.MainForm = new MainForm(); 

    // close login form 
    this.Close(); 

    // set up context to track main form instead of login 
    Program.Context.MainForm.Show(); 
} 
Problemi correlati