PictureBoxes
の動的番号(データベース値に基づく)を持つwinformアプリケーションがあります。各P-BoxにはTooltip
コントロールがあります。
メモリリークを発生させずにツールチップテキストを変更するにはどうすればよいですか?現在、次のコードがありますが、メモリリークが発生しています=>以前のToolTipコントロールはGCされていません。
ところで、これはメインUIスレッドを更新しようとしているバックグラウンドスレッドです..。
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();
}
私が言ったように-これは機能しますが、リークしています。
誰か提案がありますか?
毎回新しいツールチップを作成しないでください。他のコントロールやコンポーネントの場合と同様に、ビジュアルデザイナを使用してフォームにツールチップを追加します。フォームのツールチップで毎回toolTip.SetToolTip(...)
を呼び出します。ツールチップは、フォームが破棄されるときに破棄されます。
はい、毎回新しいツールチップを作成する必要はありません。1つのツールチップで作成できます。必要なツールチップの数がわからなくても問題はありません。ツールチップがtoolTip1
と言うのが1つしかない場合は、ツールチップのキャプションを変更してイベントを制御するたびに、次を使用できます。 フォームごとに必要なToolTipインスタンスは1つだけです。
toolTip1.SetToolTip(Current_pictureBox, "<tool tip string>");
フォームごとに必要なToolTipインスタンスは1つだけです。
toolTip.SetToolTip(control, caption)
-多くのコントロールで使用でき、各コントロールにキャプションを設定できます
toolTip.ToolTipTitle
-ツールチップのタイトルを設定します。タイトルは、ツールチップで結合されたすべてのコントロールのタイトルです。例えば :
public Form1()
{
InitializeComponent();
toolTip1.SetToolTip(button1, "btn1");
toolTip1.SetToolTip(button2, "btn2");
toolTip1.SetToolTip(button3, "btn3");
}
private void button4_Click(object sender, EventArgs e)
{
toolTip1.ToolTipTitle = textBox1.Text;
}