38862
タイトルの件、TextBox、ComboBox、Label、Buttonの部品にマウスカーソルを  
当てた際に、現在表示しているTextの内容をツールチップで表示したいと  
考えております。  
もちろん、TextBoxやComboBoxのTextの内容が変わったら、変わった後の  
内容をツールチップで表示したいです。

画面をLoadした際にツールチップを指定すると、あとでTextの内容を  
変更した場合に追従してくれないため、何かうまい手はないかと考えております。

このあたりのノウハウをお持ちの方がおりましたらご教示頂きたく  
よろしくお願いいたします。
CC BY-SA 3.0
2017-10-18T03:17:50.173
38819
2020-08-21T12:38:43.650
9228
question
c# winforms
C# Windows Forms画面でコントロールにカーソル当てた際、動的にツールチップの出力内容を変更したい。
以下のようなコードじゃだめなのでしょうか?

```

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        toolTip1.SetToolTip(textBox1, textBox1.Text);
    }
    
```
CC BY-SA 3.0
2017-10-19T06:36:32.663
38859
2017-10-19T06:36:32.663
25831
38819
answer
Load時にツールチップを表示したいコントロールに設定。  
Popupイベントが発生した時に表示したいテキストに差し替えることで、その時のTextをツールチップ表示できます。

```

    private void Form1_Load(object sender, EventArgs e)
    {
        // とりあえずツールチップが出るようにしてpopupイベントを発生させる
        string caption = "dummy";
        this.toolTip1.SetToolTip(this.textBox1, caption);
        this.toolTip1.SetToolTip(this.comboBox1, caption);
        this.toolTip1.SetToolTip(this.label1, caption);
        this.toolTip1.SetToolTip(this.button1, caption);
    }
    
    // popupイベント時にツールチップのテキストを更新
    private void toolTip1_Popup(object sender, PopupEventArgs e)
    {
        string text = null;
        if (e.AssociatedControl is TextBox)
        {
            text = ((TextBox)e.AssociatedControl).Text;
        }
        else if (e.AssociatedControl is Button)
        {
            text = ((Button)e.AssociatedControl).Text;
        }
        else if (e.AssociatedControl is Control)
        {
            text = ((Control)e.AssociatedControl).Text;
        }
    
        if (string.IsNullOrEmpty(text))
        {
            //SetToolTipで""をセットするとpopupイベントが発生しなくなってしまうため空文字列以外を使う
            text = " ";
        }
        toolTip1.SetToolTip(e.AssociatedControl, text);
    }
    
```
CC BY-SA 3.0
2017-10-19T08:46:22.770
38862
2017-10-19T09:34:06.457
2017-10-19T09:34:06.457
3655
3655
38819
answer
コードを参考にVisual C++ 2010に適用すると  
"System.StackOverflowException"エラーになるため回避するコードを作成しました。

```

    FormMain(void)
    {
        toolTip1->SetToolTip(this->textBox1, L" ");
        toolTip1->SetToolTip(this->textBox2, L" ");
    }
    
    private: System::Void toolTip1_Popup(System::Object^  sender,                 
    System::Windows::Forms::PopupEventArgs^  e)
    {
    //  MessageBox::Show(String::Concat(e->AssociatedControl));
    
        String^ strtmp;
    
        if ((textBox1 == e->AssociatedControl) ||
            (textBox2 == e->AssociatedControl))
        {
            strtmp = ((Control^)e->AssociatedControl)->Text;
    
        //  // TextBoxのテキストからフルパスを作成しファイル名のみを取り出し。
        //  if (L"" != strtmp->Trim())
        //  {
        //      strtmp = System::IO::Path::GetFullPath(strtmp);
        //      strtmp = IO::Path::GetFileName(strtmp);
        //  }
    
            if (L"" == strtmp->Trim())
            {
                strtmp = L" ";
            }
    
            // ポップアップを更新するとイベントを再度発生させて繰り返すため
            // 変更のないときは内容を更新しないことでエラーを回避しています。
            if (toolTip1->GetToolTip(e->AssociatedControl) != strtmp)
            {
                toolTip1->SetToolTip(e->AssociatedControl, strtmp);
            }
        }
    }
    
```
CC BY-SA 4.0
2020-08-21T12:38:43.650
69765
2020-08-21T12:38:43.650
41586
38819
answer