2009-09-01 36 views
6

Bạn sẽ hủy đăng ký sự kiện trong một số UserControl ở đâu? Tôi đăng ký với nó trong sự kiện Load, như tôi đã làm trong các biểu mẫu. Và trong các biểu mẫu tôi thường sẽ hủy đăng ký trong sự kiện Closing, nhưng tôi không thể tìm thấy bất kỳ điều gì tương tự trong số UserControl ...Nơi hủy đăng ký sự kiện trong một UserFind WinForms

Trả lời

2

Có cần thiết phải hủy đăng ký không? Là một tham chiếu đến kiểm soát người dùng được tổ chức sau khi nó đã được dỡ xuống? Nếu không, bạn không cần phải lo lắng về các trình xử lý sự kiện bởi vì ngay sau khi điều khiển người dùng bị xóa khỏi bộ nhớ, thì các trình xử lý sự kiện cũng được. Bạn không bị rò rỉ tài liệu tham khảo theo cách đó.

+0

Vì vậy, nếu UserControl đang nghe cái gì đó, và UserControl đi ra khỏi phạm vi, sau đó xử lý sự kiện biến mất và UserControl sẽ được thu thập như nó cần. Trong khi nếu một cái gì đó đi ra khỏi phạm vi, nó sẽ không được thu thập cho đến khi một trong hai UserControl hủy đăng ký hoặc đi ra khỏi phạm vi chính nó. Tôi có đúng không? – Svish

+2

@Svish: Không. Nếu UserControl đang nghe một cái gì đó, và UserControl đi ra khỏi phạm vi, UserControl sẽ ** không ** được thu thập, như cái gì đó vẫn giữ một tham chiếu đến UserControl. Tôi Một cái gì đó đi ra khỏi phạm vi và UserControl không giữ một tham chiếu đến nó, Cái gì đó sẽ được thu thập. – dtb

+0

Vì vậy, nói cách khác, nếu một cái gì đó sẽ tồn tại sau khi UserControl chết, tôi sẽ phải hủy đăng ký để UserControl được thu thập? – Svish

1

Như những người khác đã nói là có thực sự cần phải hủy đăng ký trong kịch bản của bạn?

Nếu bạn thực sự cần phải huỷ đăng ký tuy nhiên bạn làm điều đó một cách chính xác điều ngược lại của việc đăng ký:

UserControl1.Click -= new EventHandler(UserControl1_Click); 
+0

Nhưng tôi sẽ làm ở đâu? – Svish

4

lần khi bạn muốn thực hiện điều này (ví dụ, khi sử dụng CAB).
Để hoàn chỉnh, câu trả lời cho câu hỏi của bạn là:

protected override void OnCreateControl() 
{ 
    base.OnCreateControl(); 
    if(!DesignMode) //only time this.ParentForm should be null 
     this.ParentForm.FormClosing += ParentForm_FormClosing; 
} 

private void ParentForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    //Unregister events here 
} 

Bạn cũng có thể ghi đè lên Dispose()

+0

Sự cố mà kiểm soát này không có tham chiếu đến cả biểu mẫu gốc hoặc cấp độ gốc. –

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