2012-01-05 45 views
11

Tôi có một WinForm mà tôi tạo để hiển thị lời nhắc bằng nút. Đây là một khung nhìn WinForm tùy chỉnh, vì hộp thoại hộp thông điệp không đủ.Phát hiện khi biểu mẫu đã bị đóng C#

Tôi bắt đầu và chạy một nhân viên nền. Tôi cũng muốn thoát khỏi vòng lặp while (aBackgroundWorker.IsBusy) nếu nút trên myForm được nhấp vào.

//MyProgram.cs 

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.Show(theFormOwner); 
    myForm.Refresh(); 

    while(aBackgroundWorker.IsBusy) 
    { 
     Thread.Sleep(1); 
     Application.DoEvents(); 
    } 
} 

Ngay bây giờ, trong CustomForm sự kiện Button_clicked, tôi có

//CustomForm.cs 

private void theButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

Tôi có cần phải thêm mã hơn để lớp CustomForm, hoặc vị trí nơi tôi tuyên bố và khởi tạo các hình thức theo thứ tự để có thể phát hiện một đóng cửa?

+0

hình thức gì/lớp nào bạn muốn thông báo của gần cửa sổ? – Decker97

+1

Viết mã này không có ý nghĩa. Có lẽ có cái gì đó * sau * trong khi vòng lặp này. Di chuyển mã đó đến trình xử lý sự kiện RunWorkerCompleted cho BGW đó. –

Trả lời

21

Để phát hiện khi biểu mẫu được thực sự đóng cửa, bạn cần treo các sự kiện FormClosed:

this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 

    void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     // Do something 
    } 

Hoặc:

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed); 
    ... 
} 

void MyForm_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    // Do something 
} 
+0

đã lưu lại ngày của tôi .. cảm ơn bạn vì câu trả lời tuyệt vời – MBH

+0

Tài liệu tham khảo khác đã giúp tôi hiểu một chút: http://www.dreamincode.net/forums/topic/185541-trigger-event-in-another-form/ 'void riêng button1_Click (đối tượng người gửi, EventArgs e) { Form2 form2 = new Form2(); form2.FormClosed + = new FormClosedEventHandler (form2_FormClosed); form2.Show(); } void form2_FormClosed (người gửi đối tượng, FormClosedEventArgs e) { MessageBox.Show ("Biểu mẫu 2 đóng!"); } ' –

0

Xử lý sự kiện FormClosing của biểu mẫu để được thông báo khi biểu mẫu đóng, để bạn có thể thực hiện bất kỳ việc dọn dẹp nào.

+0

Biểu mẫu là một dạng chung được sử dụng trong suốt ứng dụng của tôi, vì vậy tôi không thể nói trong CustomForm.cs OnFormClosing - dọn sạch phần cụ thể này của MyProgram.cs – jkh

+0

Bạn có thể cần phải làm điều đó dưới mọi hình thức nếu việc dọn dẹp cụ thể cho biểu mẫu. – Kekoa

0

Một vài điều ...

Đầu tiên, nó xuất hiện vòng lặp đó ở đó để ngăn chặn việc thực thi biểu mẫu thực hiện trong khi hộp thoại đang mở. Nếu đúng như vậy, hãy thay đổi bạn .Show(parent) thành .ShowDialog(parent). Điều đó cũng sẽ chăm sóc phần còn lại của câu hỏi của bạn.

1

Đảm bảo nhân viên hỗ trợ của bạn hỗ trợ hủy và những người khác đã chỉ ra sử dụng trình xử lý sự kiện biểu mẫu đã đóng. Mã này sẽ chỉ cho bạn đúng hướng:

using(CustomForm myForm = new CustomForm()) 
{ 
    myForm.FormClosed += new FormClosedEventHandler(ChildFormClosed); 
    myForm.Show(theFormOwner); 
    myForm.Refresh(); 


    while(aBackgroundWorker.IsBusy) 
    { 
    Thread.Sleep(1); 
    Application.DoEvents(); 
    } 
} 

void ChildFormClosed(object sender, FormClosedEventArgs e) 
{ 
    aBackgroundWorker.CancelAsync(); 
} 
5

Bạn có thể sẽ quá mức cần thiết. Để hiển thị biểu mẫu như cửa sổ hộp thoại và chờ cho đến khi thoát ra trước khi trả lại quyền kiểm soát về biểu mẫu gọi, chỉ cần sử dụng:

mySubForm.ShowDialog();

Điều này sẽ "chặn" biểu mẫu chính cho đến khi trẻ bị đóng.

+0

Điều này giúp ánh sáng giao diện người dùng và đơn giản hóa ý định đọc và làm rõ. Không có mùi. –

0

Lưu ý rằng this.Hide(); là không giống như this.Close(); trong hộp thoại thực tế trọng của bạn sự kiện khép kín

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