DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ListViewのアイテムごとにToolTipを表示する方法

環境/言語:[VB2005]
分類:[.NET]

ListViewの各セルにマウスを持ってくると
TolTipを表示するようにしたいのですが
やり方が分かりません。

ListViewのアイテムごとにToolTipを表示する
http://dobon.net/vb/dotnet/control/lvitemtooltip.html

を見たのですが、1カラム(1列)の例で、
MSDNのヘルプを見ても1カラム(1列)の例しか載っていません。

複数列ある場合、それぞれにToolTipを設定する方法が分かりません。

ご教授の程、宜しくお願い致します。
■No23463に返信(makoさんの記事)
> ListViewのアイテムごとにToolTipを表示する
> http://dobon.net/vb/dotnet/control/lvitemtooltip.html
>
> を見たのですが、1カラム(1列)の例で、

> 複数列ある場合、それぞれにToolTipを設定する方法が分かりません。
そうなんですか???
ボクには.NET Framework 1.1以前 のサンプルコードの応用で
できるように見えましたが?
■No23464に返信(るしぇさんの記事)
> そうなんですか???
> ボクには.NET Framework 1.1以前 のサンプルコードの応用で
> できるように見えましたが?

出来ないといっているのではなく、分からないと書いたのですが
「そのぐらい自分で考えろ」ということでしょうか?

そういうことでしたら、大変失礼しました。
■No23465に返信(makoさんの記事)
何もないところで考えろではなく、
応用すればできそうなサンプルコードがあるので解析しろです。
makoさん

> ListViewのアイテムごとにToolTipを表示する
> http://dobon.net/vb/dotnet/control/lvitemtooltip.html
>
> を見たのですが、1カラム(1列)の例で、

この意味がわからないのですが、

Tipsでは、1つ1つのItemにToolTipの文字列を設定していますので、
Framework2.0のTipsでも可能だと思うのですが。
「複数列」というのが、項目が折り返されて複数列表示されているということなのか、詳細表示でサブ項目が表示されているということなのか、どちらなのでしょうか?
2008/12/06(Sat) 04:15:47 編集(投稿者)

とりあえず、サンプルを書いてみました。
参考になれば幸いです。
 
    Dim m_lastsubitem As ListViewItem.ListViewSubItem
 
    ' ListView1のViewプロパティがDetailsの場合
    Private Sub ListView1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove
        ' 「Me」は、ListView1を配置したFormオブジェクト
        Dim hi As ListViewHitTestInfo = Me.ListView1.HitTest(Me.ListView1.PointToClient(Control.MousePosition))
        Dim si As ListViewItem.ListViewSubItem = hi.SubItem
 
        If Me.m_lastsubitem Is si Then Return
 
        If Me.ToolTip1.Active = True Then
            Me.ToolTip1.Active = False
        End If
        If si IsNot Nothing Then
            Me.ToolTip1.SetToolTip(Me.ListView1, si.Text)
            Me.ToolTip1.Active = True
        End If
 
        Me.m_lastsubitem = si
 
    End Sub
きいよ様、管理人様

質問がわかりにくくて申し訳ありません。

> 「複数列」というのが、項目が折り返されて複数列表示されているということなのか、詳細表示でサブ項目が表示されているということなのか、どちらなのでしょうか?

Excel などの表計算では行と列という言い方をするのですが、プログラミングではそういう言い方をしないのですね。
そんなことも知らない私です。
すみません、Excelで言うところの行ではなく列です。

詳細表示でサブ項目が表示されているということです。


H.K.R.様

サンプルを書いて頂ありがとうございます。

ただそれは「ListViewのアイテムごとにToolTipを表示する」
http://dobon.net/vb/dotnet/control/lvitemtooltip.html
の.NET Framework 1.1以前の説明で分かっているのですが
るしぇ様の書かれているそれを応用するというのが出来ません。


分からない点は

'アイテムごとにツールヒントが表示されるようにする
ListView1.ShowItemToolTips = True
Dim lvi As New ListViewItem("日本語")
'アイテムのツールヒントを設定する
lvi.ToolTipText = "こんにちは。"
ListView1.Items.Add(lvi)


上記で日本語が書かれている枠にマウスオーバーすると「こんにちは。」というツールヒントが表示されます。


'アイテムごとにツールヒントが表示されるようにする
ListView1.ShowItemToolTips = True
Dim lvi As New ListViewItem(New String() {"日本語", "英語"})
'アイテムのツールヒントを設定する
lvi.ToolTipText = "こんにちは。"
ListView1.Items.Add(lvi)


上記が正しいかどうかも分かりませんが、このように1行2列あった場合に
1列目の「日本語」は「こんにちは。」のツールヒントが設定されますが
2列目の「英語」に「Hallo.」のツールヒントの設定方法が分かりません。

「日本語」に「日本語」、「英語」に「英語」のツールヒントが表示されるようにすることは
DOBON.NET の .NET Tips の例や、H.K.R様のサンプルで出来るのですが
それを応用することが出来ません。


> 応用すればできそうなサンプルコードがあるので解析しろです。

と言われることももっともなので、ListView自体をしっかり分かっていないと言うこともあるのですが、頑張って解析します。


ありがとうございました。
makoさん

ListViewは、ListViewItemを表示幅等に応じて折り返され表示されますので、
1つ1つのItemにToolTipの文字列を設定していきます。

ListViewItem毎にToolTipTextを設定すれば良いと思います。

以下のサンプルで考えている動き出はないでしょうか?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListView1.ShowItemToolTips = True

For i As Integer = 0 To 9
Dim item As ListViewItem = New ListViewItem()

item.Text = "Item:" & i
item.ToolTipText = i & "個目の項目"

ListView1.Items.Add(item)
Next
End Sub
2008/12/06(Sat) 13:25:15 編集(投稿者)

■No23476に返信(きいよさんの記事)
> makoさん
>
> ListViewは、ListViewItemを表示幅等に応じて折り返され表示されますので、
> 1つ1つのItemにToolTipの文字列を設定していきます。
>
> ListViewItem毎にToolTipTextを設定すれば良いと思います。
>
> 以下のサンプルで考えている動き出はないでしょうか?


きいよ様

サンプル提示いただき、ありがとうございます。
しかしその動きではありません。

私が分からないのは行ではなく、列です。
ご呈示いただいたように各行の1列目にツールヒントを設定出来るのですが
各行の2列目(サブ項目と言うのでしょうか?)にツールヒントを設定する方法が分からなくて悩んでいます。

つまり「サブアイテム」(.Items(0).SubItems)にツールヒントを設定する方法です。

と、ここまで書いてタイトルの間違いに気づきました。
「ListViewのアイテムごとにToolTipを表示する方法」ではなく、
「ListViewのサブアイテムごとにToolTipを表示する方法」でした。

1列目を「アイテム」と言い、2列目以降を「サブアイテム」というのですね。
言葉をしらない為に、皆さんに誤解を招いてしまい申し訳ありませんでした。


「ListViewのアイテムごとにToolTipを表示する」
http://dobon.net/vb/dotnet/control/lvitemtooltip.html
の.NET Framework 1.1以前の方法で設定出来るのですが
表示されている文字列とは違う文字列を表示したいのです。

.NET Framework 2.0以降のサンプルコードでアイテムに設定された文字列とは別の文字列がツールヒントに設定出来ているのを見て
サブアイテムにも設定出来ないものかと思いいろいろやってみたり、調べてみたりしたのですが、
私のスキルでは分からなかった(実際に出来るのかどうかも分からなかった)ので
質問させて頂きました。
makoさん
SubItemに対してのTipsでしたら、るしぇさんが書かれているように、
.NET Framework 1.1以前 のサンプルコードの応用でできますよ。

ヒントだけ。
サンプルは、マウス座標のListViewItemを取得していて、
それのTextをToolTipに設定させるようにしてますので、
それを、
1 マウス座標のListViewItemを取得(lvi)
2 取得したListViewItem(lvi)の GetSubItemAtで、座標位置のサブアイテム取得
3 サブアイテムのTextをToolTipに設定
  ※ Textと別文字を表示したいのであればここでサブアイテム毎に文字列を設定

以上でできると思います。
質問の意図を取り違え、失礼しました。
ListViewSubItemのTagプロパティを使う方法が考えられます。
以下のコードで試してみてください。
 
Public Class ListViewToolTipTestForm_ver2
    Inherits Form
 
    Dim WithEvents ListView1 As New ListView
    Dim ToolTip1 As New ToolTip
 
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Me.Text = Me.GetType.Name
        With Me.ListView1
            .View = View.Details
            .Bounds = New Rectangle(100, 100, 300, 300)
            .Columns.Add("列1")
            .Columns.Add("列2")
            .Columns.Add("列3")
            Dim lvi As New ListViewItem(New String() {"日本語", "英語", "VisualBasic"})
            lvi.SubItems(0).Tag = "こんにちは"
            lvi.SubItems(1).Tag = "Hello"
            lvi.SubItems(2).Tag = "Hello World!!"
            .Items.Add(lvi)
        End With
        Me.Controls.Add(Me.ListView1)
        MyBase.OnLoad(e)
    End Sub
 
    Dim m_lastsubitem As ListViewItem.ListViewSubItem
 
    Private Sub ListView1_MouseMove(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove
        Dim hi As ListViewHitTestInfo = Me.ListView1.HitTest(Me.ListView1.PointToClient(Control.MousePosition))
        Dim si As ListViewItem.ListViewSubItem = hi.SubItem
 
        If Me.m_lastsubitem Is si Then Return
 
        If Me.ToolTip1.Active = True Then
            Me.ToolTip1.Active = False
        End If
        If si IsNot Nothing Then
            Me.ToolTip1.SetToolTip(Me.ListView1, Me.MyToString(si.Tag))
            Me.ToolTip1.Active = True
        End If
        Me.m_lastsubitem = si
    End Sub
    Private Function MyToString(ByVal o As Object) As String
        If o Is Nothing Then Return ""
        Return o.ToString
    End Function
End Class
きいよ様、H.K.R様

私のスキルでは完成するのに時間がかかりそうですが
お二人のおかげで道筋が見え、何とか出来そうです。

ありがとうございました。


追伸:
.NET Framework 2.0 の「ListViewのアイテムごとにToolTipを表示する方法」は
タイトル通りアイテムにToolTipを表示する機能が追加されただけで
サブアイテムに表示する機能はないということですね。
解決済み!
makoさん
> 追伸:
> .NET Framework 2.0 の「ListViewのアイテムごとにToolTipを表示する方法」は
> タイトル通りアイテムにToolTipを表示する機能が追加されただけで
> サブアイテムに表示する機能はないということですね。
そうなります。

> ListViewのアイテムごとにToolTipを表示する
> http://dobon.net/vb/dotnet/control/lvitemtooltip.html
に記載されている例は、そのまま、ListViewItem毎にToolTipを表示する方法となります。
きいよ様

コメントありがとうございます。
この掲示板はある程度スキルのある方でないと利用できないのかと思い
レベルの低い質問をして後悔していましたが、
親切に対応していただき、とても感謝しています。

私もスキルが付き、初心者のサポートが出来るレベルになりましたら
困っている方の手助けをするという形で恩返しをしていきたいと思います。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板