2010-09-08 26 views
24

Tôi muốn một người nào đó thử và giải thích sự khác biệt giữa chúng. Cụ thể hơn, ví dụ về tình huống sử dụng.Form_Load() 'event' hoặc Override OnLoad()

Tôi refactoring một số Windows Form mã và một Form có một số mã trong trường hợp Form_Load() và cũng trong một sự kiện protected override void OnLoad() mà các cuộc gọi base.OnLoad(e); Bây giờ tôi bắt nguồn từ nó và cháy Override đầu tiên và sau đó ngay lập tức bắn ra khỏi Phiên bản sự kiện.

Vì vậy, cái nào thường được sử dụng và tại sao?

+0

cũng xem https://stackoverflow.com/questions/2521322/what-setup-code-should-go-in-form-constructors-versus-form-load-event – DaveInCaz

Trả lời

23

Bạn nên luôn ghi đè OnLoad(). Việc sử dụng sự kiện chỉ thích hợp khi một lớp học khác sẽ quan tâm đến sự kiện. Đó là những sự kiện dành cho. Một lớp khác đang quan tâm đến sự kiện Load là rất hiếm, chỉ thực sự hữu ích để làm công cụ sắp xếp cửa sổ.

Tuy nhiên, sự kiện Tải hoạt động tốt với trình thiết kế và lập trình viên VB6 rất thoải mái với nó. Nó không phải là sai lầm khủng khiếp, bạn chỉ gặp rắc rối khi bạn bắt đầu kế thừa biểu mẫu và mã không chạy đúng thứ tự.

Hầu hết mã hiện được đưa vào sự kiện Tải thực sự thuộc về hàm tạo. Bạn chỉ cần OnLoad nếu:

  • Bạn cần biết kích thước và vị trí chính xác của cửa sổ. OnLoad là tốt nhất, cửa sổ Xử lý được tạo ra và các ưu tiên người dùng được áp dụng (tiêu đề và kích thước biên giới) và hình thức đã được rescaled theo chỉ dẫn của các Form.AutoScaleMode bất động sản. Cửa sổ vẫn chưa được nhìn thấy, một thời điểm rất tốt để di chuyển cửa sổ ở nơi khác hoặc sắp xếp các điều khiển con.
  • Bạn có mã cần thuộc tính Xử lý. Điều này là tinh tế, bạn không thể luôn luôn nói. Có mã như vậy trong constructor là không lành mạnh, cửa sổ được tạo ra trước khi constructor hoàn thành. Nó thường đi đến một kết thúc tốt nhưng nó có thể làm cho việc tạo ra các hình thức rất chậm. Dễ chẩn đoán từ cửa sổ Call Stack.
  • Để tránh lỗi trong triển khai MDI. Nếu bạn tạo một MDI con trong constructor cha, thì bạn sẽ nhận được glyphs trùng lặp, hiển thị khi bạn tối đa hóa con. Tạo con trong OnLoad để thay thế.
+0

Vì vậy, hãy dừng tôi nếu tôi sai, nhưng nó là "đúng" để sử dụng 'OnLoad()' nhưng tôi sẽ cần phải nhận thức được thực tế rằng mã trong đó sẽ không có sẵn cho một lớp khác. Chính xác? –

+0

Nó * là * có sẵn cho một lớp dẫn xuất, base.OnLoad(). Bỏ qua việc khởi tạo lớp cơ sở sẽ hầu như luôn sai. * Lớp * khác không có doanh nghiệp với mã trong Tải/Tải. –

+0

Vì vậy, nếu một lớp dẫn xuất gọi là 'OnLoad()' nó sẽ bắn 'base.OnLoad()' và sau đó bất kỳ mã nào tôi đặt sau đó. –

0

OnLoad tăng số sự kiện Tải, trong đó xử lý. Xem số .

Vì vậy, trong mã của bạn, ở cuối hàm khởi tạo, bạn có thể gọi hàm OnLoad. Lớp cơ sở sau đó sẽ gọi trình xử lý sự kiện của bạn (trong trường hợp này), mà bạn có thể đã đặt trong mã khởi tạo của mình.

Cá nhân, tôi sẽ đặt mã của mình ở số Form_Init và để OnLoad để bắt đầu sự kiện, vì tôi đang xử lý sự kiện, mặc dù bạn có thể bảo vệ một trong hai lý do chính đáng như bạn thấy từ câu trả lời của mình.

+0

Tôi có thể dày đặc nhưng tôi nghĩ bạn đang xác nhận những gì tôi đã nói về OnLoad gọi là Load Event nhưng điều này có trả lời câu hỏi của tôi về câu hỏi mà tôi nên đặt mã của tôi không? Có vẻ như, với tôi, tôi có thể đặt nó bằng một trong hai hiệu ứng bằng nhau chừng nào nó còn sau cuộc gọi 'base.OnLoad (e)'. –

+2

Câu trả lời này không giải quyết được câu hỏi, không liên quan đến việc * gọi * 'OnLoad' nhưng có nên * ghi đè lên nó hay không. – reinierpost

2

Khi ghi đè OnLoad, gọi tới số base.OnLoad gọi số Load -kiểu mẫu.

protected override void OnLoad(EventArgs e) 
{ 
    // do stuff before Load-event is raised 
    base.OnLoad(e); 
    // do stuff after Load-event was raised 
} 

Nếu bạn không đặc biệt cần phải thực hiện những thứ trước khi Load-sự kiện được nâng lên, đặt mã trong OnLoadsaubase.OnLoad(e) cung cấp cho các hành vi gian chạy giống như cách đặt nó trong xử lý sự kiện.

Tôi khuyên bạn nên ghi đè phương thức thay vì đăng ký sự kiện.

+0

Cảm ơn bạn đã trả lời nhưng có vẻ như bạn đang nói không có câu trả lời dứt khoát cho câu hỏi của tôi ngoài thời gian tải Biểu mẫu, đúng không? –

+1

Tôi sẽ tự ghi đè phương thức OnLoad vì đây là cách tiếp cận điển hình khi tạo các lớp kế thừa. Các sự kiện, như đã đề cập bởi Hans Passant, có nghĩa là cho các lớp học khác, những người có thể đăng ký những điều này. Nhưng trong thực tế không có sự khác biệt thực sự. – bernhof