2011-08-30 15 views
13

Tôi có ứng dụng biểu mẫu có số động (dựa trên giá trị cơ sở dữ liệu) là PictureBoxes. Mỗi P-Box có một điều khiển Tooltip.Làm thế nào tôi có thể thay đổi văn bản của một điều khiển ToolTip hiện có, trong một PictureBox trong ứng dụng WinForm của tôi?

Tôi làm cách nào để thay đổi Văn bản Mẹo công cụ mà không bị rò rỉ bộ nhớ? Ngay bây giờ, tôi đã có mã sau đây, nhưng nó bị rò rỉ bộ nhớ => các điều khiển ToolTip trước đó không nhận được GC'd.

BTW, đây là một chủ đề nền mà đang cố gắng cập nhật các thread UI chính ....

if (pictureBox == null || !pictureBox.IsHandleCreated) { 
    continue; 
} 

Action setTooltipAndImage =() => { 
    var toolTip = new ToolTip(); 
    GameServer tempGameFile = gameServer; 
    toolTip.SetToolTip(pictureBox, string.Format(...)); 
    pictureBox.Image = Resources.RedButton; 
}; 

if (pictureBox.InvokeRequired) {       
    pictureBox.Invoke(setTooltipAndImage); 
} else { 
    setTooltipAndImage(); 
} 

Như tôi đã nói - làm việc này nhưng nó bị rò rỉ.

Bất kỳ ai có bất kỳ đề xuất nào?

+0

hmm .. tại sao lưu ý lại? có vẻ như một câu hỏi trung thực? –

+0

+1 đến et bạn trở lại không, có vẻ như một câu hỏi hoàn toàn chấp nhận được. BTW: những công cụ bạn đang sử dụng để xem rò rỉ bộ nhớ ToolTip? –

+0

Tôi đang sử dụng ANTS Memory Profiler. Dưới đây là một câu hỏi tương tự mà tôi đã hỏi với ảnh chụp màn hình: http://stackoverflow.com/questions/7225959/how-can-i-debug-this-stackoverflowexception-in-my-winform-application –

Trả lời

19

Không tạo Chú giải công cụ mới mỗi lần. Thêm một chú giải công cụ vào biểu mẫu bằng cách sử dụng trình thiết kế trực quan, giống như bạn làm cho bất kỳ điều khiển hoặc thành phần nào khác. Hãy gọi số toolTip.SetToolTip(...) trên đầu công cụ của biểu mẫu mỗi lần. ToolTip sẽ được xử lý khi Form được xử lý.

+0

Vấn đề với điều đó là tôi không biết tôi cần bao nhiêu. Nó dựa trên một số dữ liệu động. Vì vậy, tôi cần phải làm cho chúng tự động. –

+7

Bạn chỉ cần một. Một thành phần ToolTip có thể cung cấp lời khuyên cho hàng ngàn điều khiển. Khi bạn gọi 'toolTip.SetToolTip (Control, Text)', nó thêm điều khiển và văn bản vào bộ sưu tập nội bộ và xử lý các sự kiện chuột của điều khiển. Khi bạn di chuột qua một điều khiển, thành phần ToolTip tra cứu văn bản được liên kết. Để loại bỏ một mục từ bộ sưu tập này, hãy gọi 'toolTip.SetToolTip (Điều khiển, null)' –

+0

W00t - có vẻ như đó là lừa :) có vẻ tốt ... –

2

Có, bạn không cần phải tạo Chú giải công cụ mới mỗi lần, một ToolTip sẽ thực hiện. Không có vấn đề nếu bạn không biết có bao nhiêu ToolTips bạn muốn, bởi vì nếu chỉ có một ToolTip nói toolTip1, sau đó bạn có thể sử dụng sau mỗi khi bạn muốn thay đổi chú thích ToolTip và kiểm soát trên một số sự kiện. Bạn chỉ cần một ví dụ ToolTip cho mỗi biểu mẫu.

toolTip1.SetToolTip(Current_pictureBox, "<tool tip string>");