2011-11-22 25 views
5

Tôi đã theo dõi xuống một rò rỉ bộ nhớ và tôi đã thu hẹp nó xuống một ToolTip được phân bổ trong một lớp học có nguồn gốc từ UserControl.Làm thế nào để tự động dọn dẹp ToolTip trong UserControl

Các ToolTip được phân bổ trong phân bổ trong constructor của kiểm soát và khởi tạo trong sự kiện Load như thế này: mẹ

public class CommonProfile : System.Windows.Forms.UserControl 
{ 
    private ToolTip toolTip1; 

    ... 

    public CommonProfile() 
    { 
     InitializeComponent(); 

     // Create the ToolTip and associate with the Form container. 
     toolTip1 = new ToolTip(this.components); 
    } 

    private void CommonProfile_Load(object sender, System.EventArgs e) 
    { 
     // Set up the delays for the ToolTip. 
     toolTip1.AutoPopDelay = 5000; 
     toolTip1.InitialDelay = 1000; 
     toolTip1.ReshowDelay = 500; 
     // Force the ToolTip text to be displayed whether or not the form is active. 
     toolTip1.ShowAlways = true; 

     // Set up the ToolTip text 
     toolTip1.SetToolTip(this.btnDeleteEntry, "Delete this Profile"); 
     toolTip1.SetToolTip(this.lblProfileType, "Edit this Profile"); 
     toolTip1.SetToolTip(this.lblProfileData, "Edit this Profile"); 
     toolTip1.SetToolTip(this.picFlagForUpdate, "Toggle Flag for Update"); 
    }  
} 

của điều khiển có một đời vượt quá tuổi thọ của kiểm soát. Điều khiển này được tạo ra khi đang bay và được thêm vào điều khiển bảng điều khiển và sau đó được loại bỏ khỏi điều khiển của bảng điều khiển.

Tôi thấy rằng thành viên Dispose của điều khiển không được gọi, rõ ràng là do tham chiếu đến ToolTip vẫn còn.

Tôi đã thêm một phương pháp Shutdown như thế này:

public void Shutdown() 
{ 
    toolTip1.RemoveAll(); 
} 

Gọi phương thức Shutdown loại bỏ sự rò rỉ và Dispose được cuối cùng gọi.

Thật không may, giải pháp này yêu cầu bất cứ ai sử dụng điều khiển ghi nhớ để gọi phương pháp tắt máy khi họ kết thúc với nó.

Tôi muốn biết nếu có cách nào đó để tôi có thể tự động hóa điều này để nó xảy ra mà không cần phải gọi phương pháp tắt máy một cách rõ ràng.

+0

Tôi đoán bạn cần phải gọi vứt bỏ trên chú giải công cụ hoặc trong việc vứt bỏ điều khiển người dùng của bạn hoặc bạn có thể có chức năng dọn dẹp để thực hiện điều đó cho bạn, như phương pháp shutDown của bạn. – PRR

+0

1. Xem tại đây [http://stackoverflow.com/questions/672980/dispose-on-user-controls-really-meant-to-edit-the-designer-cs-file][1] [1]: http://stackoverflow.com/questions/672980/dispose-on-user-controls-really-meant-to-edit-the-designer-cs-file – VMykyt

Trả lời

3

Bạn không hiển thị mã cho cách bạn đang xử lý UserControl từ Panel của mình.

Chỉ cần gọi số:

panel1.Controls.Remove(userControl1); 

sẽ không vứt bỏ các UserControl.

Bạn cần phải đặc biệt gọi:

userControl1.Dispose(); 

đó cũng sẽ tự động loại bỏ nó ra khỏi Panel. Trong UserControl của bạn, nếu bạn cần làm của riêng bạn dọn dẹp, hãy thử đăng ký vào sự kiện Vứt bỏ riêng của nó:

private ToolTip toolTip1; 

public UserControl1() { 
    InitializeComponent(); 
    // tooltip initialization 
    this.Disposed += UserControl1_Disposed; 
} 

private void UserControl1_Disposed(object sender, EventArgs e) { 
    if (toolTip1 != null) 
    toolTip1.Dispose(); 
} 
+0

Cảm ơn bạn đã làm việc! – Avalanchis

1

Cũng trong phương pháp xử lý kiểm soát của bạn, bạn cần phải gọi một cách rõ ràng vứt bỏ trên tooltip của bạn.

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