Código en Main () accesible o inalcanzable dependiendo de abrir otro formulario

StackOverflow https://stackoverflow.com/questions/479368

  •  20-08-2019
  •  | 
  •  

Pregunta

Tengo una aplicación de bolsillo para PC y tengo un problema grave con la que se describe aquí: https://stackoverflow.com/questions / 472598 . Mientras buscaba una solución, probé un código bastante estúpido en Main ():

[MTAThread]
        static void Main()
        {
            Application.Run(new Tasks());
            Application.Exit();
        }

y establezca el punto de interrupción al salir. si solo ejecuto la aplicación y luego cierro la ventana, se alcanza el punto de interrupción. si ejecuto la aplicación y luego abro otra ventana:

private void questButton_Click(object sender, EventArgs e)
        {
            QuestionnairesWindow questWindow = new QuestionnairesWindow();
            questWindow.Show();
            this.Hide();
}

y luego volver a la ventana inicial:

private void backButton_Click(object sender, EventArgs e)
        {
            Tasks tasksWindow = new Tasks();
            tasksWindow.Show();
            this.Close();
        }

y cierre el inicial de la misma manera que la primera vez, nunca se alcanza el código Apllication.exit () y tengo la impresión de que la aplicación no está realmente cerrada (no puedo volver a abrirla). perdón si la descripción es complicada

editar: la pregunta es: ¿alguna idea de por qué se comporta de manera diferente?

¿Fue útil?

Solución

new Tasks() en Main() no es el mismo objeto con Tasks tasksWindow = new Tasks();

Tienes 2 objetos de Tareas, así que cerrando en segundo lugar, el primero todavía está presente y nunca muere. Debe pasar a QuestionnairesWindow la referencia de Tasks actual.

Puede hacerlo con un constructor <=> adicional:

private Tasks tasks;

public QuestionnairesWindow(Tasks t)
{
  this.tasks = t;
}

usando:

new QuestionnairesWindow(this).Show(); // where this = current `Tasks` created in `Main`

Otros consejos

Esta línea parece ser el problema:

Tasks tasksWindow = new Tasks();

Si entiendo su código correctamente, en su backButton_Click, está creando una nueva instancia de su formulario Tareas, en lugar de mostrar la que originalmente ocultó. Esto significa que la aplicación nunca termina, porque todavía hay una ventana abierta, pero oculta.

Lo que probablemente quiera hacer es pasar la referencia del formulario Tareas al formulario Ventana de cuestionarios.

El problema que tiene es que en backButton_Click está creando una nueva instancia de la ventana Tareas. La ventana de Tareas original todavía se está ejecutando, simplemente está oculta. Sospecho que necesita pasar una referencia al formulario de Tareas original en la Ventana de cuestionarios para que pueda elegir mostrarlo nuevamente.

Usted necesita agregar un método público / interno en su QuestionnairesWindow donde establece qué formulario de Tareas hizo que se abriera el QuestionnairesWindow. Llama a este método en questButton_Click con la referencia this antes de llamar a this.Hide (). Esta referencia se almacenará en una variable privada dentro de QuestionnairesWindow.

Luego, en el backButton_Click, utiliza esta variable privada, para llamar al método .Show (), para mostrar el formulario principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top