2010-08-09 20 views
6

Actualmente estoy trabajando en un proyecto pequeño y me gustaría obtener ayuda.Cerrar formulario sin solicitud de salida

Tengo 2 formularios, el primero es una ventana de inicio de sesión y el segundo será el programa principal. El problema que tengo es que cuando cierro form1 con this.Close() sale de todo el programa.

Tengo la sensación de que necesito usar subprocesos o algo así, pero no puedo encontrar el recurso correcto para resolver mi problema.

Gracias.

+2

Está este winforms o wpf? Y no es un problema de enhebrar, sino más bien un problema de qué es "esto" en el ámbito en el que lo está utilizando con mayor probabilidad. El código ayudará –

+0

posible duplicado de [Cerrar un formulario y luego llamar a otro.] (Http://stackoverflow.com/questions/2751076/closing-a-form-and-then-call-another-one) –

+0

No lo he hecho mucho con winforms, pero solo para verificar, está creando su pantalla de inicio de sesión con la ventana principal ya que es principal, ¿no? –

Respuesta

6

Usted podría ocultar la primera forma en lugar de cerrarlo:

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

Luego tengo otro problema, cuando cierro Form2 me gustaría cerrar el Form1 oculto, ¿cómo hago eso? –

+0

@Victor: De la misma manera, pero deberá ofrecer una forma de cerrar genuinamente ambos formularios y cerrar la aplicación. –

+0

@Victor: Application.Exit() debería hacer el truco –

2

Si está utilizando WPF, puede establecer Application.MainWindow a su segunda ventana "principal", antes de cerrar el formulario de inicio de sesión.

+0

Una forma más de WPF es más flexible ... –

+0

en realidad en vb.net puede especificar el modo de apagado de la aplicación. C# no te permite decir fácilmente. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/61b817f8-d7d3-44de-9095-91a6e3f2150c – ioWint

3

¿No puedes cambiar tu program.cs para que ejecute el formulario principal, y en el lanzamiento del formulario principal que crea y muestra un formulario de inicio de sesión y luego se oculta (esperando que el inicio de sesión se muestre a sí mismo))?

+1

Exactamente lo que iba a decir: Asegúrate de no estar usando el primer formulario para cargar la aplicación de esta manera ... Application.Run (new Form1()); – MilkyWayJoe

1

Program.cs es donde su función principal es. Si creó el proyecto como una aplicación de Windows con Visual Studio, entonces habrá una función en main que ejecuta el formulario que se abre cuando inicia el programa. Simplemente obtenga la información de inicio de sesión desde el formulario de inicio de sesión en main y luego llame a la segunda ventana. Aquí está un ejemplo:

[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: olvidó algo

me olvidó mencionar que si lo hace llegar los miembros de la forma de la conexión, tendrá que crear una instancia por primera vez. Esto no es una buena técnica, y recomiendo hacer la idea global de clase de usuario sobre esto, pero no tengo un programa que requiere este método, y como lo he mencionado, aquí está el ejemplo:

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

programa abierto. cs: puede hacer bastante antes de la ejecución de la aplicación, incluida la información de inicio de sesión. Aquí hay una muestra de uno de mis proyectos. Intenta encontrar la conexión a la base de datos. Si no puede, abre un asistente y se conecta para acceder o mssql. Si la apertura es buena, muestra una pantalla de spalsh y finalmente ejecuta la aplicación, de lo contrario, se cierra.

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

cuál es su opinión para crear algo así

tray Icon

su icono llamada bandeja

para que el usuario pueda close all forms y la app still running ,, y user can go back to app any time

vamos a empezar la codificación (tenga en cuenta que esta es la aplicación 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 
    }; 
} 

y tenemos estas funciones

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

y en Window Closing detector de eventos (no olvide añadirlo)

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

eso es todo, espero que le ayude

Cuestiones relacionadas