Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Windows Forms Listitem Tooltip

Posted on 2003-11-07
11
Medium Priority
?
1,167 Views
Last Modified: 2007-12-19
Does anyone know if it's possible to give individual list items a tooltip in .NET? It was possible in VB6, so I can't believe the functionality has gone, but I can't find any mention of how to do it.

The reason I'm after this is that my list occasionally contains items which are too big to display, and I'd like to be able to pop-up a tooltip with the full item text.

Thanks.

Sauce.
0
Comment
Question by:LordSauce
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
  • 2
  • +1
11 Comments
 
LVL 28

Expert Comment

by:iboutchkine
ID: 9700983
you can dynamically change Listbox associated tooltip to display
current selected item, just create a tooltip object ,set its properties to
match listbox selected item.
Something like:

toolTip1.SetToolTip(Me.Listbox1, listbox1.selecteditem.ToString)
toolTip1.ShowAlways=True

0
 

Author Comment

by:LordSauce
ID: 9701162
Ideally I'd like to display a tooltip for the item under the cursor, rather than the selected item.
0
 
LVL 28

Expert Comment

by:iboutchkine
ID: 9701283
I am not sure that you can do that. But I might be wrong
0
NFR key for Veeam Agent for Linux

Veeam is happy to provide a free NFR license for one year.  It allows for the non‑production use and valid for five workstations and two servers. Veeam Agent for Linux is a simple backup tool for your Linux installations, both on‑premises and in the public cloud.

 
LVL 27

Expert Comment

by:Dabas
ID: 9702347
Hi LordSauce:
Based partly on the help example for tooltips

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.ListBox1 = New System.Windows.Forms.ListBox
        Me.SuspendLayout()
        '
        'ListBox1
        '
        Me.ListBox1.Items.AddRange(New Object() {"Hello, how are you today!", "I am well thanks!"})
        Me.ListBox1.Location = New System.Drawing.Point(56, 64)
        Me.ListBox1.Name = "ListBox1"
        Me.ListBox1.Size = New System.Drawing.Size(96, 30)
        Me.ListBox1.TabIndex = 0
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.ListBox1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Dim toolTip1 As New ToolTip

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

        ' Set up the delays for the ToolTip.
        toolTip1.AutoPopDelay = 5000
        toolTip1.InitialDelay = 1000
        toolTip1.ReshowDelay = 500
        ' Force the ToolTip text to be displayed whether or not the form is active.
        toolTip1.ShowAlways = True

        ' Set up the ToolTip text for the Button and Checkbox.
        toolTip1.SetToolTip(Me.ListBox1, "My checkBox1")

    End Sub

    Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
        Try
            Dim pt As New System.Drawing.Point(e.X, e.Y)
            'Dim s As String = CStr(ListBox1.GetChildAtPoint(pt).Text)
            toolTip1.SetToolTip(ListBox1, ListBox1.Items(e.Y Mod 12).ToString)
        Catch
        End Try
    End Sub
End Class


Dabas
0
 
LVL 27

Expert Comment

by:Dabas
ID: 9702371
I am not completely happy with this solution, but it will point you in the right direction.
You can see the commented line
Dim s As String = CStr(ListBox1.GetChildAtPoint(pt).Text)

I would have assumed that line would return the correct string, but when I tried it out, GetChildAtPoint returned Nothing.

e.Y Mod 12 will kind of work if your font size is set to 12 points.


0
 
LVL 27

Expert Comment

by:Dabas
ID: 9702379
Hmmm.

Just checked and the font size is definitely smaller than 12.
Anyhow, this should be pointing you in the right direction!

Dabas
0
 
LVL 3

Expert Comment

by:the-edge
ID: 9704699
GetChildAtPoint returns a child control, not the item under the mouse pointer. you can get it with the IndexFromPoint method:

    Private Sub ListBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseMove
        Try
            Dim pt As New System.Drawing.Point(e.X, e.Y)
            Dim s As String = CStr(ListBox1.Items(ListBox1.IndexFromPoint(pt)))
            toolTip1.SetToolTip(ListBox1, s)
        Catch
        End Try
    End Sub

this works very well

the edge
0
 
LVL 27

Expert Comment

by:Dabas
ID: 9704880
the-edge:
> this works very well

It certainly does!

Dabas
0
 

Author Comment

by:LordSauce
ID: 9710925
Thanks edge, but that only exists for listboxes, not list views!

Each item in my list has an icon, which (AFAIK) rules the listbox out.

Something similar for the listview would be great though...

Thanks also Dabas - will continue playing with your code!
0
 
LVL 27

Accepted Solution

by:
Dabas earned 1000 total points
ID: 9710985
LordSauce:
Add this to the above code:

   Private Sub ListView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseMove
        Try
            Dim pt As New System.Drawing.Point(e.X, e.Y)
            Dim lv As ListView = CType(sender, ListView)
            'Dim li As ListViewItem = lv.GetItemAt(e.X, e.Y)
            toolTip1.SetToolTip(ListView1, lv.GetItemAt(e.X, e.Y).Text)
        Catch
        End Try
    End Sub

Dabas
0
 

Author Comment

by:LordSauce
ID: 9713119
This is what I've ended up using.

Storing the last available tooltip at the form level prevents the tooltip moving with the mouse - the code to set the tooltip is only fired once each time an individual listitem is entered, so the tooltip is only displayed once.

I'm also testing the length of the item to see whether a tooltip is required - I only want to display it if the text of the item is partly hidden. Because of the icon being displayed, it's necessary to adjust the width of the list slightly - 16 pixels seems to work fine.

Thanks again for your help!

------------------------------------------------------------------

Private Sub lvwAvailable_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lvwAvailable.MouseMove

    Try
        Dim itmTemp As ListViewItem = lvwAvailable.GetItemAt(e.X, e.Y)

        ' check mouse is over a list item
        If (Not IsNothing(itmTemp)) Then

            ' check whether tooltip has already been displayed since entering the item
            If (Not (itmTemp.Text.Equals(strLastAvailableTooltip))) Then

                Dim g As Graphics = CreateGraphics()

                ' check whether tooltip is required
                ' only necessary if item not fully visible (width - 16 to take icon into account)
                If g.MeasureString(itmTemp.Text, itmTemp.Font).Width > lvwAvailable.Width - 16 Then
                    ttpToolTip.SetToolTip(lvwAvailable, itmTemp.Text)
                    strLastAvailableTooltip = itmTemp.Text
                Else
                    ttpToolTip.SetToolTip(lvwAvailable, String.Empty)
                    strLastAvailableTooltip = String.Empty
                End If
            End If
        End If

    Catch
    End Try

End Sub
0

Featured Post

 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
Please read the paragraph below before following the instructions in the video — there are important caveats in the paragraph that I did not mention in the video. If your PaperPort 12 or PaperPort 14 is failing to start, or crashing, or hanging, …

596 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question