2010-08-09 20 views
6

Attualmente sto lavorando a un piccolo progetto e vorrei ricevere aiuto su di esso.Chiudi modulo senza domanda di uscita

Ho 2 moduli, il primo è una finestra di accesso e il secondo sarà il programma principale. Il problema che ho è che quando chiudo form1 con this.Close() sta uscendo dall'intero programma.

Ho la sensazione che ho bisogno di usare il threading o qualcosa del genere ma non riesco a trovare la giusta risorsa per il mio problema da risolvere.

Grazie.

+2

Is questo winforms o wpf? E non è un problema di threading, ma piuttosto un problema di cosa "questo" è nello scope che tu stai usando molto probabilmente. Il codice aiuterà. –

+0

possibile duplicato di [Chiudere un modulo e chiamarne un altro.] (Http://stackoverflow.com/questions/2751076/closing-a-form-and-then-call-another-one) –

+0

Non l'ho fatto molto con winforms, ma solo per verificare, si sta creando la schermata di login con la finestra principale come genitore, no? –

risposta

6

Si potrebbe nascondere la prima forma, invece di chiuderlo:

this.Hide(); 
Form2 form2 = new Form2(); 
form2.Show(); 
+1

Quindi ho un altro problema, quando chiudo Form2 Vorrei chiudere il Form1 nascosto, come posso farlo? –

+0

@Victor: allo stesso modo, ma dovrai offrire un modo per chiudere effettivamente entrambi i moduli e chiudere l'app. –

+0

@Victor: Application.Exit() dovrebbe fare il trucco –

2

Se stai usando WPF, è possibile impostare Application.MainWindow alla seconda finestra "principale", prima di chiudere il modulo di login.

+0

Un altro modo in cui WPF è più flessibile ... –

+0

in realtà in vb.net è possibile specificare la modalità di arresto dell'applicazione. C# non ti permette di dire facilmente. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/61b817f8-d7d3-44de-9095-91a6e3f2150c – ioWint

3

Non puoi cambiare il tuo program.cs in modo che venga eseguito il modulo principale, e nel lancio del modulo principale crea e mostra un modulo di login e poi si nasconde (aspettando che il login accada per mostrarsi)?

+1

Esattamente quello che stavo per dire: Assicurati di non utilizzare il primo modulo per caricare l'applicazione in questo modo ... Application.Run (new Form1()); – MilkyWayJoe

1

Program.cs è dove si trova la funzione principale. Se hai creato il progetto come App per Windows con Visual Studio, allora ci sarà una funzione in main che esegue il modulo che si apre all'avvio del programma. Basta avere le informazioni di accesso dal modulo di login in main e quindi chiamare la seconda finestra. Ecco un esempio:

[STAThread] 
private static void Main(string[] args) 
{ 
    //there's some other code here that initializes the program 

    //Starts the first form (login form) 
    Application.Run(new form1()); 

    //Get the login info here somehow. Maybe save in public members of form1 or 
    // in a global utilities or global user class of some kind 

    //Run the main program 
    Application.Run(new mainProgramForm()); 
} 

EDIT: dimenticato qualcosa

ho dimenticato di dire che, se si vuole ricevere i membri dal modulo di login si dovrà istanziare prima. Questa non è una buona tecnica, e vi consiglio di fare l'idea globale classe utente su questo, ma ho un programma che richiede questo metodo, e dal momento che l'ho detto, ecco l'esempio:

private static void Main(string[] args) 
{ 
    //there's some other code here that initializes the program 

    //Instead of running a new form here, first create it and then run it 
    Form1 form1 = new Form1(); //Creates the form 
    Application.Run(form1);  //Runs the form. Program.cs will continue after the form closes 

    //Get the login info 
    string username = form1.Username; 
    string password = form1.Password; 

    //Get rid of form1 if you choose 
    form1.Dispose(); 

    //Validate the user info 

    //Run the main program 
    Application.Run(new mainProgramForm()); 
} 
0

programma aperto. cs: puoi fare un bel po 'di tempo prima che venga eseguita la chiamata all'applicazione, compresa la visualizzazione delle informazioni di accesso. Ecco un esempio di uno dei miei progetti. Prova a trovare la connessione al database. Se non può, apre una procedura guidata e si connette ad accesso o mssql. Se l'apertura è buona mostra uno schermo spalsh e infine esegue l'applicazione, altrimenti si chiude.

Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
DialogResult LclResult; 

EESDatabasePersistentData LclPersist; 
LclPersist = new EESDatabasePersistentData(); 
string LclDataType; 
string LclDatabase; 
string LclServer; 
string Password; 
string UserID; 
if (!LclPersist.GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password)) 
{ 
     // Run the connection wizard 
     GetConnection(out LclServer, out LclDatabase, out LclDataType, out UserID, out Password); 
} 


if (LclDataType == "ACCESS") 
     InitDataAccess(LclDatabase); 
else if (LclDataType == "SQLSERVER") 
     InitDataSQL(LclServer, LclDatabase, UserID, Password); 
if (OpenGood) 
{ 
     if (!System.Diagnostics.Debugger.IsAttached) 
     { 
       FormSplash.Instance.SetupVersion(); 
       /////////////////////////////////// 
       // If we don't call do events 
       // splash delays loading. 
       Application.DoEvents(); 
       FormSplash.Instance.Show(); 
     } 
     Application.DoEvents(); 

     Application.Run(new FormMentorMain()); 
} 
else 
     Application.Exit(); 
0

che cosa è la tua opinione per creare qualcosa di simile

tray Icon

sua icona denominata vassoio

modo l'utente può close all forms e la app still running ,, e user can go back to app any time

lascia iniziare a scrivere codice (nota questa è l'applicazione WPF)

private NotifyIcon m_notifyIcon; 
private ContextMenuStrip m_contextMenu; 
private bool _ForceClose; 

public MainWindow() 
{ 
    InitializeComponent(); 
    CreateNotifyIcon(); 

} 

private void CreateNotifyIcon() 
{ 
    m_contextMenu = new ContextMenuStrip(); 

    ToolStripMenuItem mI1 = new ToolStripMenuItem { Text = "Open" }; 
    mI1.Click += (sender, args) => Maximize(); 
    ToolStripMenuItem mI2 = new ToolStripMenuItem { Text = "Exit" }; 
    mI2.Click += (sender, args) => EndApplication(); 
    m_contextMenu.Items.Add(mI1); 
    m_contextMenu.Items.Add(mI2); 
    //Initalize Notify Icon 
    m_notifyIcon = new NotifyIcon 
    { 
     Text = "Application Title", 
     Icon = new Icon("Icon.ico"), 
     //Associate the contextmenustrip with notify icon 
     ContextMenuStrip = m_contextMenu, 
     Visible = true 
    }; 
} 

e abbiamo queste funzioni

protected void Minimize() 
{ 
    Hide(); 
} 

protected void Maximize() 
{ 
    Show(); 
    this.WindowState =WindowState.Normal; 
} 

protected void EndApplication() 
{ 
    Minimize(); 
    Thread.Sleep(1000); 
    _ForceClose = true; 
    WindowState = WindowState.Normal; 
    this.Close(); 
    Environment.Exit(0); 
} 

e in Window Closing listener di eventi (non dimenticate di aggiungerlo)

private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    if (_ForceClose == false) 
    { 
     e.Cancel = true; 
     Minimize(); 
    } 
} 

questo è tutto, spero che ti aiutano