2012-08-17 19 views
8

En la inicialización de una forma (la forma principal), que llama a otro formulario para obtener un montón de a partir de entrada, y luego se transfiere una gran cantidad de información:esperar para conseguir información de una forma emergente

Form3 getup = new Form3(); 
getup.Show(); 
example = getup.example; 

Sin embargo , Necesito esperar a que se complete esta nueva información de formulario.

Form3 getup = new Form3(); 
getup.Show(); 
waitfordone(); 
example = getup.example; 

ATM, He intentado usar while:

Form3 getup = new Form3(); 
getup.Show(); 
While(getup.visible=true)Console.WriteLine("waiting"); 
example = getup.example; 

Pero esto provoca un bloqueo ... es decir, que se ejecuta, a continuación, se congela. Sospecho que esto es porque el ciclo while está consumiendo todo el procesamiento. Entonces, traté de crear un nuevo hilo

Form3 getup = new Form3(); 
Thread t = new Thread(getup.Show()); 
t.start(); 
While(getup.visible=false)Console.WriteLine("waiting"); // takes a little bit to open 
While(getup.visible=true)Console.WriteLine("waiting"); //waits for close 
example = getup.example; 

Pero esto también hace que se cuelgue. Quizás por la misma razón. He buscado eventos autoreseteados.

Y he intentado:

AutoResetEvent invisible = new AutoResetEvent(false); 
Form3 getup = new Form3(); 
void setup_invisible(object sender, EventArgs e) 
{ 
    if (getup.Visible == false) invisible.Set(); 
} 
public ... { 
getup.VisibilityChanged += new EventHandle(setup_Invisible); 
getup.show(); 
invisible.WaitOne(); 
... } 
// and many other variations on this 

pero por desgracia, se abre Form3, lo cierra (debido a que el hilo se hace?), Y luego se cuelga en invisible.WaitOne();

Por favor alguien puede explicar cómo hacer esto , leer me está haciendo más confundido.

+0

Duplicado de: http://stackoverflow.com/questions/3222834/block-until-a-form-closes-winforms –

Respuesta

11

Lo que puede necesitar es un cuadro de diálogo.

Form3 getup = new Form3(); 
getup.ShowDialog(); 
example = getup.example; 

Esto pausará la ejecución y solo continuará una vez que se cierre el formulario.

+2

Esto funciona. Muchas gracias. –

1

Usted querrá utilizar eventos:

Form3 getup = new Form3(); 
getup.Show(); 
getup.FormClosing += (sender, args) => 
{ 
    example = getup.example; 
} 

Es importante que el método actual para terminar inmediatamente, de modo que el hilo de interfaz de usuario puede ir adelante con ella de bucles. Al asociarlo a un controlador de eventos, se asegura de que su código se ejecute cuando sea necesario. El concepto completo de "esperar que se cierre la forma del niño" es inherentemente contrario al diseño de las formas de ganar.

También podría hacer que el formulario sea una ventana emergente de diálogo.

Form3 getup = new Form3(); 
getup.ShowDialog(); 
example = getup.example; 

Eso funcionará bien, sin congelación involuntaria.

+0

@Matt Razza Revertí tu edición. Considero que el primer método se usó, ya que es claramente la intención del OP tener el diálogo no modal, lo cual no es para nada malo. – Servy

+0

¿Por qué el OP no quiere que el diálogo no sea modal? –

+0

@MattRazza Es posible que quiera un menú emergente modal, por lo que lo incluí en mi respuesta, pero actualmente no está utilizando una ventana emergente modal. Esto implicaría que quiere que el formulario principal esté activo mientras el formulario secundario está activo. Dado que este es un caso de uso razonablemente común, no solo asumiré que él pretendía que fuera modal. Suponer que todas las ventanas emergentes siempre serán modales es un error en mi mente. – Servy

Cuestiones relacionadas