Ayuda abrir y cerrar forms

Iniciado por alkalo, 17 Noviembre 2017, 16:33 PM

0 Miembros y 1 Visitante están viendo este tema.

alkalo

Buenas necesito ayuda con una cosa a ver si me haceis el favor de ayudarme :)

se abrir un form segundario con :

                 
Código (csharp) [Seleccionar]
       private void PB_BUTT(object sender, EventArgs e)
       {
          this.Hide();
          Selecionar frm = new Selecionar();
          frm.Visible = true;



       }


Pero luego a la hora de querer desde el segundo retroceder al primero no me encuentra el "Principal" y no puedo hacerlo visible. Me ayudais porfa?  GRACIAS!

Eleкtro

#1
Hola. Por favor, publica las dudas sobre C# en el subforo de programación .NET, y debes formatear el código usando las etiquetas GeShi...

Respondiendo a tu pregunta, hay varias formas. La más simple y sencilla sería abrir el Form secundario a modo de ventana de diálogo, lo que detendrá la ejecución del Form desde el que se haya abierto (en tu caso, el Form principal), y entonces cuando el Form secundario se cierre, puedes continuar con una sentencia para mostrar el Form desde el que se abrió el Form secundario... un ejemplo para que se entienda:

Código (csharp,3) [Seleccionar]
this.Hide();
Form2 frm = new Form2();
frm.ShowDialog();
this.Show();

Nota: ten presente que la función Form.ShowDialog() devuelve el resultado del diálogo, pero en este caso en concreto es innecesario evaluarlo, así que lo omití.




Otra forma sería crear un contexto de aplicación, lo que nos aportaría el beneficio de poder mantener una referencia corta para el acceso al Form principal desde cualquier parte de nuestra aplicación. Un ejemplo:

Program.cs
Código (csharp,8,15,16) [Seleccionar]
using System;
using System.Windows.Forms;

namespace WindowsFormsApp1 {

   static class Program {

       internal static ApplicationContext Context { get; set; }

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

           Program.Context = new ApplicationContext(new Form1());
           Application.Run(Context);
       }
   }
}


Entonces, desde un form secundario puedes llamar al Form Principal de la siguiente manera:
Código (csharp,3) [Seleccionar]
// ...
private void Form2_FormClosed(object sender, FormClosedEventArgs e) {
   Program.Context.MainForm.Show();
}
// ...





Y otra forma sería iterar los elementos de la colección Application.OpenForms.

...O también podrías pasarle una referencia del form principal al form secundario. Como digo, maneras hay muchas.

Saludos.








alkalo

Opto por la sencilla, pero como puedo desde la segunda llamar a la primera sentencia?
Osea desde la primera puedo decir Segunda frm = new Segunda();
Pero desde la segunda no pueda llamar a la primera. Sabes?

Eleкtro

#3
Cita de: alkalo en 17 Noviembre 2017, 17:37 PM
Opto por la sencilla, pero como puedo desde la segunda llamar a la primera sentencia?

No entiendo a que te refieres exactamente, ¿lo que quieres no es instanciar/mostrar el form secundario, y que cuando el form secundario se cierre, o sin que se cierre desde un botón del form secundario por ejemplo, poder mostrar el form principal?, para eso ya se te ofrecieron soluciones, si no es eso lo que quieres hacer entonces sería mejor si muestras un ejemplo en pseudocódigo de lo que quieres conseguir.

saludos








alkalo

Haber, primero gracias por la ayuda.
Tenemos la primera ventana principal que tiene un boton que hace esto:

private void Form1Button(object sender, EventArgs e)
        {
           this.Hide();
           Form2 frm = new Form2();
           frm.Visible = true;
           
       

        }

Y despues tenemos el segundo menu que quiero que tenga un boton de ir hacia atras

Me gustaria que fuera asi: (Pero no detecta el primer form)

        private void Form2Button(object sender, EventArgs e)
        {

            this.Hide();
            Form1 frm1 = new Form1();
            frm1.Visible = true;

        }


ME EXPLICO FATAL PERO ESPERo QUE LO ENTIENDAS.

alkalo

Es hacer lo que has dicho, pero con la forma sencilla no puedo hacerlo no?

alkalo

entonces cuando el Form secundario se cierre, puedes continuar con una sentencia para "mostrar el Form desde el que se abrió el Form secundario"
Esto no se como puedo hacerlo  :(

Eleкtro

Por favor, LEE y respeta las normas del foro y las normas del subforo d eprogramación general. Está prohibido hacer doble post, y por segunda vez: debes formatear el código que pubiques. Lo siento por ser "duro", pero sino esto se convierte en un caos. Formatea el código, no cuesta nada.




En tu escenario, creo que entonces la solución que más te convendría sería hacer esto:

Cita de: Eleкtro en 17 Noviembre 2017, 17:30 PMY otra forma sería iterar los elementos de la colección Application.OpenForms.

Ejemplo usando LINQ:
Código (csharp) [Seleccionar]
Form f = (from item in Application.OpenForms.Cast<Form>()
         where item.Name.Equals("Form1")
         select item
        ).Single();
       
f.Show();


Pero lo que intentas hacer en realidad por lo que comentas, parece que quieres hacer una especie de Wizard, y en ese caso no lo estás haciendo de forma correcta, ya que lo que deberías hacer es definir una clase que controle la navegación por los Forms, en lugar de hardcorear sentencias de navegación directamente en cada clase de Form. Puedes hacerlo como prefieras, te va a funcionar igual, pero no es lo más correcto hacerlo así.

Aquí tienes un buen template para el desarrollo de Wizards:

Y aquí más info y documentación:

Saludos








alkalo

Cita de: Eleкtro en 17 Noviembre 2017, 17:30 PM


Otra forma sería crear un contexto de aplicación, lo que nos aportaría el beneficio de poder mantener una referencia corta para el acceso al Form principal desde cualquier parte de nuestra aplicación. Un ejemplo:

Program.cs
Código (csharp,8,15,16) [Seleccionar]
using System;
using System.Windows.Forms;

namespace WindowsFormsApp1 {

   static class Program {

       internal static ApplicationContext Context { get; set; }

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

           Program.Context = new ApplicationContext(new Form1());
           Application.Run(Context);
       }
   }
}


Entonces, desde un form secundario puedes llamar al Form Principal de la siguiente manera:
Código (csharp,3) [Seleccionar]
// ...
private void Form2_FormClosed(object sender, FormClosedEventArgs e) {
   Program.Context.MainForm.Show();
}
// ...






Perdona Mod puedes explicarme un poco mejor esto? Para entenderlo.

Eleкtro

Cita de: alkalo en 17 Noviembre 2017, 20:51 PMPerdona Mod puedes explicarme un poco mejor esto? Para entenderlo.

¿Qué es lo que no entiendes exactamente de todo ese código?.

El método "Main" es el punto de entrada o entry-point de la aplicación, el método que se utiliza para mostrar el Form principal que se hará visible. Bien, con la clase ApplicationContext creamos una nueva información contextual de la aplicación (para redefinirla, en este caso), al constructor de dicha clase le pasamos como argumento el Form principal de la aplicación. Y con el método Application.Run() especificamos el contexto en el que se ejecutará la aplicación (el contexto que hemos creado con la clase ApplicationContext) en el método "Main". Ten en cuenta que no es necesario hacer esto, solo si quieres usar un contexto para mantener una referencia corta del Form principal, pero te propuse varias otras soluciones a elegir, céntrate en la última que te dije, te será más facil.

Saludos