2012-08-17 8 views
8

Przy inicjalizacji formularza (formularz główny), wywołuje inną formę, aby uzyskać kilka począwszy wejściowe, a następnie przenosi wiele informacji:Czekaj uzyskać informacje z formularza podręcznego

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

jednak , Muszę poczekać na zakończenie tej nowej informacji o formularzu.

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

ATM, próbowałem za pomocą podczas wypowiedzi:

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

Ale powoduje to hang ... to znaczy, że działa, a następnie zamarza. Podejrzewam, że to dlatego, że pętla while pobiera całe przetwarzanie. Tak więc próbowałem utworzyć nowy wątek, ale powoduje to również zawieszenie. Być może z tego samego powodu. Zajrzałem do autoresetevents.

Próbowałem:

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 

ale niestety, otwiera form3, zamyka go (ponieważ wątek jest zrobione?), A następnie zawiesza w invisible.WaitOne();

Może ktoś proszę wyjaśnić, jak to zrobić , czytanie tylko sprawia, że ​​jestem bardziej zdezorientowany.

+0

Duplikat: http://stackoverflow.com/questions/3222834/block-until-a-form-close-winforms –

Odpowiedz

11

To, czego możesz potrzebować, to okno dialogowe.

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

Spowoduje to wstrzymanie wykonywania i będzie kontynuowane tylko po zamknięciu formularza.

+2

To działa. Dziękuję bardzo. –

1

będziemy chcieli użyć zdarzenia:

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

To ważne dla obecna metoda natychmiast zakończyć, tak, że wątek UI może iść na z jego pętli. Dołączając do programu obsługi zdarzeń, upewniasz się, że Twój kod jest uruchamiany, gdy zajdzie taka potrzeba. Cała koncepcja "czekania, aż dziecko się zamknie" jest z natury sprzeczna z projektowaniem winform.

Można również utworzyć formularz w oknie podręcznym okna dialogowego.

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

To zadziała dobrze, bez niezamierzonego zamrożenia.

+0

@Matt Razza Powróciłem do edycji. Uważam, że pierwsza metoda została zaakceptowana, ponieważ oczywistym zamiarem OP jest, aby dialog nie był modalny, co wcale nie jest złe. – Servy

+0

Dlaczego OP nie chce, aby dialog nie był modalny? –

+0

@MattRazza Z pewnością możliwe, że chce modalnego wyskakującego okienka, dlatego umieściłem go w mojej odpowiedzi, ale obecnie nie używa modalnego popup. Sugerowałoby to, że chce, aby forma rodzicielska była aktywna, gdy formuła dziecka jest już gotowa. Ponieważ jest to dość powszechny przypadek użycia, nie zakładam po prostu, że miał on być modalny. Założenie, że wszystkie wyskakujące okienka będą zawsze modalne, jest błędem w moim umyśle. – Servy

Powiązane problemy