web-dev-qa-db-ja.com

WinFormアプリケーションのPictureBoxで、既存のToolTipコントロールのテキストを変更するにはどうすればよいですか?

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();
}

私が言ったように-これは機能しますが、リークしています。

誰か提案がありますか?

17
Pure.Krome

毎回新しいツールチップを作成しないでください。他のコントロールやコンポーネントの場合と同様に、ビジュアルデザイナを使用してフォームにツールチップを追加します。フォームのツールチップで毎回toolTip.SetToolTip(...)を呼び出します。ツールチップは、フォームが破棄されるときに破棄されます。

24
Hand-E-Food

はい、毎回新しいツールチップを作成する必要はありません。1つのツールチップで作成できます。必要なツールチップの数がわからなくても問題はありません。ツールチップがtoolTip1と言うのが1つしかない場合は、ツールチップのキャプションを変更してイベントを制御するたびに、次を使用できます。 フォームごとに必要なToolTipインスタンスは1つだけです。

toolTip1.SetToolTip(Current_pictureBox, "<tool tip string>");
4
Shweta patel
  1. フォームごとに必要なToolTipインスタンスは1つだけです。

  2. toolTip.SetToolTip(control, caption)-多くのコントロールで使用でき、各コントロールにキャプションを設定できます

  3. 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;
}

enter image description here

0
Z.R.T.