c # abrir un nuevo formulario y luego cerrar el formulario actual?

Por ejemplo, supongamos que estoy en la forma 1 y luego quiero:

  1. Abra el formulario 2 (desde un botón en el formulario 1)
  2. Cerrar formulario 1
  3. Centrarse en la forma 2

La solución de Steve no funciona. Al llamar this.Close (), el formulario actual se elimina junto con form2. Por lo tanto, necesita ocultarlo y establecer form2. Evento cerrado para llamar a this.Close ().

private void OnButton1Click(object sender, EventArgs e) { this.Hide(); var form2 = new Form2(); form2.Closed += (s, args) => this.Close(); form2.Show(); } 

Intenta hacer esto …

 { this.Hide(); Form1 sistema = new Form1(); sistema.ShowDialog(); this.Close(); } 

Los seres problemáticos con esa línea:

Application.Run(new Form1()); Que probablemente se puede encontrar en su archivo program.cs.

Esta línea indica que form1 es para manejar el ciclo de mensajes; en otras palabras, form1 es responsable de seguir ejecutando su aplicación; la aplicación se cerrará cuando se cierre el formulario1.

Hay varias formas de manejar esto, pero todas ellas de una forma u otra no cerrarán form1.
(A menos que cambiemos el tipo de proyecto a algo que no sea la aplicación de formularios de Windows)

El que creo que es más fácil para su situación es crear 3 formas:

  • form1: seguirá siendo invisible y actuará como administrador; puede asignarlo para que maneje un ícono de bandeja si lo desea.

  • form2 – tendrá el botón, que cuando se haga clic cerrará form2 y abrirá form3

  • form3 – tendrá el rol de la otra forma que necesita ser abierta.

Y aquí hay un código de muestra para lograr eso:
(También agregué un ejemplo para cerrar la aplicación desde el tercer formulario)

 static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); //set the only message pump to form1. } } public partial class Form1 : Form { public static Form1 Form1Instance; public Form1() { //Everyone eveywhere in the app should know me as Form1.Form1Instance Form1Instance = this; //Make sure I am kept hidden WindowState = FormWindowState.Minimized; ShowInTaskbar = false; Visible = false; InitializeComponent(); //Open a managed form - the one the user sees.. var form2 = new Form2(); form2.Show(); } } public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var form3 = new Form3(); //create an instance of form 3 Hide(); //hide me (form2) form3.Show(); //show form3 Close(); //close me (form2), since form1 is the message loop - no problem. } } public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1. } } 

Nota: trabajar con paneles o cargar controles de usuario dinámicamente es más académico y preferible que los estándares de producción de la industria, pero me parece que solo estás tratando de razonar sobre cómo funcionan las cosas. Para este propósito, este ejemplo es mejor.

Y ahora que se entienden los principios, intentémoslo con solo dos formas:

  • La primera forma asumirá el papel del administrador al igual que en el ejemplo anterior, pero también presentará la primera pantalla, por lo que no se cerrará sino que se ocultará.

  • El segundo formulario tendrá la función de mostrar la pantalla siguiente y al hacer clic en un botón se cerrará la aplicación.

  public partial class Form1 : Form { public static Form1 Form1Instance; public Form1() { //Everyone eveywhere in the app show know me as Form1.Form1Instance Form1Instance = this; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //Make sure I am kept hidden WindowState = FormWindowState.Minimized; ShowInTaskbar = false; Visible = false; //Open another form var form2 = new Form2 { //since we open it from a minimezed window - it will not be focused unless we put it as TopMost. TopMost = true }; form2.Show(); //now that that it is topmost and shown - we want to set its behavior to be normal window again. form2.TopMost = false; } } public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1.Form1Instance.Close(); } } 

Si modifica el ejemplo anterior, elimine form3 del proyecto.

Buena suerte.

No eras específico, pero parece que intentabas hacer lo que hago en mis aplicaciones de Win Forms: comienza con un formulario de inicio de sesión, luego de iniciar sesión con éxito, cierra ese formulario y pon atención en un formulario principal. Así es como lo hago:

  1. hacer frmMain el formulario de inicio; esto es lo que mi Program.cs se ve así:

     [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); } 
  2. en mi frmLogin, crea una propiedad pública que se inicializa en falso y se establece en verdadero solo si se produce un inicio de sesión exitoso:

     public bool IsLoggedIn { get; set; } 
  3. mi frmMain se ve así:

     private void frmMain_Load(object sender, EventArgs e) { frmLogin frm = new frmLogin(); frm.IsLoggedIn = false; frm.ShowDialog(); if (!frm.IsLoggedIn) { this.Close(); Application.Exit(); return; } 

Sin inicio de sesión exitoso? Salga de la aplicación. De lo contrario, continúe con frmMain. Como es el formulario de inicio, cuando se cierra, la aplicación finaliza.

Muchas formas diferentes ya han sido descritas por las otras respuestas. Sin embargo, muchos de ellos involucraron ShowDialog() o ese form1 permanece abierto pero oculto. La mejor y más intuitiva manera en mi opinión es simplemente cerrar form1 y luego crear form2 desde una ubicación externa (es decir, no desde ninguna de esas formas). En el caso en que form1 se creó en Main , form2 simplemente se puede crear utilizando Application.Run al igual que form1 before. Aquí hay un escenario de ejemplo:

Necesito que el usuario ingrese sus credenciales para que pueda autenticarlas de alguna manera. Después, si la autenticación fue exitosa, quiero mostrar la aplicación principal al usuario. Para lograr esto, estoy usando dos formas: LogingForm y MainForm . El LoginForm tiene un indicador que determina si la autenticación fue exitosa o no. Este indicador se usa para decidir si se crea o no la instancia de MainForm . Ninguno de estos formularios necesita saber sobre el otro y ambos formularios pueden abrirse y cerrarse con gracia. Aquí está el código para esto:

 class LoginForm : Form { bool UserSuccessfullyAuthenticated { get; private set; } void LoginButton_Click(object s, EventArgs e) { if(AuthenticateUser(/* ... */)) { UserSuccessfullyAuthenticated = true; Close(); } } } static class Program { [STAThread] static void Main() { LoginForm loginForm = new LoginForm(); Application.Run(loginForm); if(loginForm.UserSuccessfullyAuthenticated) { // MainForm is defined elsewhere Application.Run(new MainForm()); } } } 

usa este fragmento de código en tu form1.

 public static void ThreadProc() { Application.Run(new Form()); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc)); t.Start(); this.Close(); } 

Tengo esto de aquí

Supongamos que tiene dos Formulario, el Nombre del primer nombre es Form1 y el segundo nombre del formulario es Form2. Debe pasar de Form1 a Form2 para ingresar el código aquí. Escriba el código como sigue:

En Form1 tengo un botón llamado Button1, y en su opción de clic escriba el siguiente código:

 protected void Button1_Click(Object sender,EventArgs e) { Form frm=new Form2();// I have created object of Form2 frm.Show(); this.Visible=false; this.Hide(); this.Close(); this.Dispose(); } 

Espero que este código te ayude

 private void buttonNextForm(object sender, EventArgs e) { NextForm nf = new NextForm();//Object of the form that you want to open this.hide();//Hide cirrent form. nf.ShowModel();//Display the next form window this.Close();//While closing the NextForm, control will come again and will close this form as well } 
 //if Form1 is old form and Form2 is the current form which we want to open, then { Form2 f2 = new Form1(); this.Hide();// To hide old form ie Form1 f2.Show(); } 

Este código puede ayudarte:

 Master frm = new Master(); this.Hide(); frm.ShowDialog(); this.Close(); 
  this.Visible = false; //or // will make LOgin Form invisivble //this.Enabled = false; // or // this.Hide(); Form1 form1 = new Form1(); form1.ShowDialog(); this.Dispose(); 

Si tiene dos formas: frm_form1 y frm_form2. El siguiente código se usa para abrir frm_form2 y cerrar frm_form1. (Para la aplicación de formulario de Windows)

  this.Hide();//Hide the 'current' form, ie frm_form1 //show another form ( frm_form2 ) frm_form2 frm = new frm_form2(); frm.ShowDialog(); //Close the form.(frm_form1) this.Close(); 

Creo que esto es mucho más fácil 🙂

  private void btnLogin_Click(object sender, EventArgs e) { //this.Hide(); //var mm = new MainMenu(); //mm.FormClosed += (s, args) => this.Close(); //mm.Show(); this.Hide(); MainMenu mm = new MainMenu(); mm.Show(); } 

Lo resolvería haciendo:

 private void button1_Click(object sender, EventArgs e) { Form2 m = new Form2(); m.Show(); Form1 f = new Form1(); this.Visible = false; this.Hide(); }