Mostrar y Cerrar Ventanas con Visual Studio 2008

Leunamal

Hola, estoy inicializandome con este IDE, realizando una aplicación con 2 ventanas.

En la primera muestro varias etiquetas, permite al usuario insertar datos y cuando pulsa el botón "aceptar" aparece un mensaje con ShowMessage() y luego se muestra otra ventana.

El contenido de la segunda ventana no es relevante en este caso.

El problema que estoy encontrando es que cuando pulso el botón, se muestra la ventana2, pero no se cierra la primera hasta que no cierre "ventana2".

El código del evento click sería el siguiente:

 private void button1_Click(object sender, EventArgs e)
        {
           if (txtNombre.Text.Length == 0 && txtApellidos.Text.Length == 0)
                MessageBox.Show("Debe indicar su nombre y sus apellidos.");
            else
            {
                String cadena = "Bienvenido " + txtNombre.Text + " " + txtApellidos.Text;
                MessageBox.Show(cadena);
                ventana2 obj = new ventana2();
                DialogResult dr = obj.ShowDialog();
                this.Close();
            }

    }

Buscando en google he encontrado a varios con el mismo problema, no veo una solución clara.

¿Alguno de ustedes sabría como arreglar esto? He pensado que seguramente si pongo en el método "init()" (no sé cual será exactamente en c#) de ventana2 pueda ocultar o cerrar ventana1, pero estoy seguro que se podrá hacer deste el mismo evento click() del botón de ventana1.

Seguramente sea una chorrada, pero no logro encontrar el fallo.

Saludos

JuAn4k4

oculta la ventana padre y a la ventana hijo le pasas el objeto this para que cuando la ventana hijo se cierre se muestre la ventana padre. Podria ser una solucion. La verdad es que tampoco se mucho de manejo de ventanas en vs

Leunamal

Hola #2. Gracias por responder.

Podría valer, pero no creo que sería apropiado pasárle como parámetro al objeto de ventana2, la referencia al objeto de ventana1 (con this). Creo que seguramente la solución sea esa, la de llamar a close o hide, una vez que esté activa la ventana2.

Saludos

eXtreM3

En realidad el uso de ventanas normales... sería hacer la insercción en la ventana hija, y luego realizar todo desde la padre.

  • Ventana padre -> botón INSERTAR
  • Se abre la ventana hija con todos los textbox (nombre, apellidos...) y abajo 2 botones, Guardar y Cancelar (por ejemplo)
  • Luego desde la ventana padre, pones if(DialogResult.OK) INSERTAMOS, else NADA.
  • Y ya está, cuando le des a cualquiera de los 2 botones en la ventana hija (tras las comprobaciones pertinentes) pues le haces el this.close

Saludos

Leunamal

Pff... No me está gustando la forma que tiene Visual Studio para gestionar las distintas ventanas..

En el método constructor de ventana2 puse esto (pensaba que con esto funcionaría):

namespace WindowsFormsApplication1
{
    public partial class ventana2 : Form
    {
        public ventana2()
        {
            InitializeComponent();
            ventana1.ActiveForm.Hide(); //o .Close().
        }

    private void Form2_Load(object sender, EventArgs e)
    {
        //lblTitulo.Text = "Usuario conectado: " + Form.lblNombre;
    }

}
}

Si pongo Hide(), cuando cierro ventana2, la aplicación está ejecutandose, pero no se ve ninguna ventana. Con close(), aunque ponga que se cierre ventana1, se cierran todas :S En fin... Sin confuso que es entonces el método Close(), supuestamente debería cerrar sólo el objeto desde el que se llama y no toda la aplicación. :S

#4 Gracias también, por contestar.

Soltrac

Pero por qué quieres quitar de memoria a la ventana1?

Si no quieres q siga la aplicación simplemente apágala después del showdialog :S. Y no es confuso, es completamente normal y es como funciona el 99% de lenguajes con orientación a objetos.

PaCoX

No abras la ventana2 desde la ventana1, abre ventana1 haz lo k kieras y luego abre la ventana 2.

Leunamal

#6 Si no se ve ninguna ventana, lo lógico es que se cierre la aplicación, ¿o no?

Creo que ya he encontrado la razón, en el main() aparece esto:

ventana1 v1 = new ventana1();
Application.Run(v1);

Por eso, al cerrar v1 se cierra todo.

En aplicaciones con Java o C++, no he tenido problemas, pero creo que es por esto del Run.

Gracias a todos por contestar.

Saludos

Soltrac

#8 No, no es lógico porque un hide() no descarga la ventana de memoria, simplemente la oculta.

Ten claro los conceptos, tu ventana no deja de ser un objeto de la clase ventana1 y hasta q no destruyas ese objeto la aplicación lo sigue teniendo en memoria.

Por último, lo del Close(), si haces un close() al formulario inicial, estás cerrando el objeto que va a llamar a TODOS los demás objetos, por lo tanto es normal que se cierre toda la aplicación.

Otra opción sería que "ventana2" fuera tu formulario inicial y q fuera este el que llama a "ventana1". En serio, tienes 4000 opciones y no es algo que sea característico de .NET, es que tienes q pensar en clases y objetos, no solo en formularios.

Leunamal

#9 Por eso comenté que es conveniente cerrar la aplicación por completo cuando se usa hide() ya que se queda cargada en memoria.

Los conceptos los tengo claro, como ya comenté antes el problema está en la llamada de Application.Run(v1); al cerrar v1 se cierra la aplicación por completo.

A ver si me busco algun libro que este decente donde encuentre ejemplos de este estilo.

Saludos y gracias por dedicar vuestro tiempo en responderme.

B

No toy mu puesto ya que hace tiempo que programaba en .net, Para que puedas cerrar la primera ventana , la 2º deberia ser otra aplicacion independiente con su correspondiente proceso, pero como todo esta bajo un mismo proyecto lo suyo sería:

Realizar un entorno oculto "ventana main" donde contenga ventana 1 y 2
de esa forma si al abrir 1 y con un boton abrir 2 y cerrar 1, no cerrara la aplicación entera pero si liberara la memoria de la ventana cerrada.

Ya que en tu caso cierras la ventana main lo que hace es cerrar el programa,

No se como lo veras xD

No te pongo comandos por que ya hace 4 años que no lo toco.

Sino me habeis entendido soz xD, no pude explicarme mejor

Usuarios habituales