2012-08-17 13 views
8

Tại khởi của một hình thức (hình thức chính), nó gọi một hình thức khác để có được một loạt các khởi đầu vào, và sau đó chuyển rất nhiều thông tin:Chờ để nhận được thông tin từ một hình thức sổ popup

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

Tuy nhiên , Tôi cần phải chờ thông tin biểu mẫu mới này hoàn tất.

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

ATM, tôi đã cố gắng sử dụng khi tuyên bố:

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

Nhưng điều này gây ra một hang ... mà là để nói, nó chạy, sau đó đóng băng. Tôi nghi ngờ điều này là do vòng lặp while đang ăn tất cả quá trình xử lý. Vì vậy, tôi đã thử tạo một chủ đề mới

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; 

Nhưng điều này cũng khiến nó bị treo. Có lẽ vì lý do tương tự. Tôi đã nhìn vào autoresetevents.

Và tôi đã cố gắng:

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 

nhưng than ôi, nó sẽ mở ra Form3, đóng nó (vì các chủ đề được thực hiện?), Và sau đó treo ở invisible.WaitOne();

Có thể ai đó xin vui lòng giải thích làm thế nào để làm điều này , đọc chỉ khiến tôi bối rối hơn.

+0

Bản sao của: http://stackoverflow.com/questions/3222834/block-until-a-form-closes-winforms –

Trả lời

11

Điều bạn có thể cần là hộp thoại.

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

Điều này sẽ tạm dừng thực thi và chỉ tiếp tục khi biểu mẫu được đóng lại.

+2

Tác phẩm này. Cảm ơn bạn rất nhiều. –

1

Bạn sẽ muốn sử dụng sự kiện:

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

Điều quan trọng đối với phương pháp hiện tại để kết thúc ngay lập tức, do đó thread UI có thể tiếp tục với vòng của nó. Bằng cách gắn vào trình xử lý sự kiện, bạn đảm bảo rằng mã của bạn được chạy khi cần. Toàn bộ khái niệm "chờ đợi hình thức con để đóng" vốn dĩ trái với thiết kế của winforms.

Bạn cũng có thể làm cho biểu mẫu bật lên Hộp thoại.

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

Điều đó sẽ hoạt động tốt, không bị đóng băng ngoài ý muốn.

+0

@Matt Razza Tôi đã hoàn nguyên chỉnh sửa của bạn. Tôi xem xét phương pháp đầu tiên được suy ra, vì rõ ràng là mục đích của OP để có hộp thoại không phải là phương thức, mà không phải là ít nhất là một điều xấu. – Servy

+0

Tại sao OP không muốn hộp thoại không phải là phương thức? –

+0

@MattRazza Chắc chắn có thể anh ấy muốn một cửa sổ bật lên phương thức, đó là lý do tôi đưa nó vào câu trả lời của tôi, nhưng anh ấy hiện không sử dụng cửa sổ bật lên phương thức. Điều này có nghĩa là anh ta muốn hình thức cha mẹ để hoạt động trong khi hình thức con là lên. Vì đây là một trường hợp sử dụng hợp lý, tôi sẽ không cho rằng anh ta có nghĩa là nó là phương thức. Giả sử rằng tất cả các cửa sổ bật lên sẽ luôn là phương thức là một sai lầm trong tâm trí của tôi. – Servy

Các vấn đề liên quan