2009-09-16 37 views
11

Một trong những người dùng của chúng tôi đã gửi nhật ký cho ứng dụng .NET Winforms của chúng tôi cho biết sự kiện Activated đang diễn ra trước sự kiện Load. Tôi không nghĩ rằng điều này là có thể và đã được mã hóa với giả định rằng Load sẽ luôn xảy ra trước Activated.Winforms - thứ tự nạp và kích hoạt sự kiện

Có ai khác quan sát thấy Activated xảy ra trước Load không?

Nếu có, tại sao và có cách nào để đảm bảo điều đó không xảy ra?

+0

@HansaA: +1. Ngay cả trong một trong những ứng dụng MDI hiện có của tôi, tôi đã tìm thấy hành vi này. Trong Winform tươi hoặc MDI đây không phải là một vấn đề. – Mahin

+0

Cảm ơn Mahin và Ash đã dành thời gian để điều tra điều này. Có vẻ như bạn về cơ bản không thể đưa ra bất kỳ giả định nào về thứ tự của hai sự kiện này. Tôi nhận ra rằng tôi có thể di chuyển mã được tải vào một phương thức được gọi là từ hàm tạo của biểu mẫu, vì vậy tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình theo cách đó. Đối với sự kiện được hiển thị: chúng tôi có phiên bản 1.1 của ứng dụng, vì vậy chúng tôi không thể sử dụng ngay cả khi được giới thiệu trong phiên bản 2.0. – HansA

+0

@HansA: Thứ tự rõ ràng là Laod, Kích hoạt, Hiển thị .... Nhưng khi bạn đang gặp vấn đề trong một trường hợp, tôi cũng nhận được cùng một vấn đề. – Mahin

Trả lời

2

Kích hoạt được gửi trước khi tải. Nếu bạn muốn viết một số mã nên được thực hiện sau khi tải thì bạn có thể sử dụng phương thức hiển thị.

Hãy tìm thấy bên dưới dãy:

  • hoạt
  • tải
  • Shown

EDIT: Vui lòng kiểm tra này rất thú vị answer trên SO mà giải thích WinForms Tải so với đêm trước nts

CHỈNH SỬA: Tôi đã tạo một mặc định Dự án Winform với biểu tượng duy nhất. Bây giờ nó là đem lại cho tôi chuỗi

  • tải
  • Đã kích hoạt
  • Shown

Tôi đang bối rối bây giờ.

+0

Điều này không chính xác, hãy xem liên kết MSDN ở trên. – Ash

+0

@Ash: Tôi đã thấy liên kết đó nhưng ở dạng MDI của tôi, nó đang hiển thị cho tôi trình tự Kích hoạt, Tải, Hiển thị .. – Mahin

+0

@Mahin Tôi nghĩ bạn nên làm rõ câu trả lời của bạn rằng đây là thứ tự bạn thấy trong Hình thức MDI, và không tuyên bố nó là thực tế không đủ tiêu chuẩn. – ProfK

19

Từ Order of Events in Windows Forms tại MSDN:

ứng dụng Startup và Shutdown Sự kiện

Mẫu và các lớp học kiểm soát phơi bày một bộ các sự kiện liên quan đến ứng dụng khởi động và tắt máy. Khi một ứng dụng Windows Forms bắt đầu, những sự kiện khởi động dạng chính được nuôi trong trình tự sau:

System.Windows.Forms.Control.HandleCreated

System.Windows.Forms.Control.BindingContextChanged

System.Windows.Forms.Form.Load

System.Windows.Forms.Control.VisibleChanged

System.Window s.Forms.Form.Kích hoạt

System.Windows.Forms.Form.Shown

Khi một ứng dụng đóng lại, các sự kiện tắt máy có dạng chính được huy động theo thứ tự sau:

System.Windows.Forms.Form .Closing

System.Windows.Forms.Form.FormClosing

System.Windows.Forms.Form.Closed

System.Windows.Forms.Form.FormClosed

System.Windows.Forms.Form.Deactivate

Bạn đang sử dụng một MessageBox trong bất kỳ sự kiện khởi động của bạn? Điều này có thể khiến các sự kiện xuất hiện để kích hoạt không đúng thứ tự vì cách Windows Forms Message Loop xử lý các cửa sổ hộp thoại.

+0

@Ash: Tôi đã kiểm tra nó ở dạng MDI và điểm ngắt của tôi đang đến theo trình tự Kích hoạt, Tải, Hiển thị ... Tại sao vậy? – Mahin

+0

@Ash: Biến đổi với cả ứng dụng MDI Tươi và ứng dụng biểu mẫu đơn giản. Trình tự MSDN là đúng. Nhưng trong một trong những ứng dụng trước đây của tôi, nơi tôi đang sử dụng mẫu MDI nó mang lại cho tôi cùng một vấn đề như HansaA có trong câu hỏi này. – Mahin

+0

http://msdn.microsoft.com/en-us/library/86faxx0d(v=vs.110).aspx –

2

Mặc dù nó đi ngược lại tài liệu của Microsoft, điều này đôi khi có thể xảy ra khi bạn truy cập vào biến công khai của một biểu mẫu tải hoặc hàm từ bên ngoài biểu mẫu. Nếu cần thiết, bạn có thể đặt cờ trong sự kiện được hiển thị và sử dụng nó để thoát trình xử lý được kích hoạt trước khi biểu mẫu được tải.

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