ToolTips für Items einer ListBox; Ergänzung erwünscht

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    ToolTips für Items einer ListBox; Ergänzung erwünscht

    Hallo zusammen!
    Ich habe ein kleines Problem bei ToolTips für die Items einer ListBox. Der folgende Code zeigt, wie man einen Tooltip für jeden Item der Listbox erzeugen und bei MouseHover anzeigen kann. Das kleine Problem ist, dass man immer mit der Maus erst den Bereich der ListBox verlassen muss, um über einen anderen Item zu fahren, den entsprechenden ToolTip anzuzeigen.
    Vielleicht kann jemand hier eine Idee entwickeln, wie man den nächsten ToolTip anzeigen kann, wenn man die Maus eben über einen anderen Item schiebt, ohne den Bereich der ListBox zu verlassen... ??

    Quellcode

    1. Dim myPoint As Point, myIndex As Short
    2. Private Sub myListBox_MouseHover(sender As Object, e As EventArgs) _
    3. Handles myListBox.MouseHover
    4. With myListBox
    5. myPoint = .PointToClient(Cursor.Position)
    6. myIndex = .IndexFromPoint(myPoint)
    7. If myIndex < 0 Then Exit Sub
    8. ToolTip1.SetToolTip(myListBox, .GetItemText(.Items(myIndex)))
    9. End With
    10. End Sub


    Grüße - Dietrich
    Nicht ganz. Die Einträge in der ListBox sind oft zu lang, als dass sie in der Listbox komplett angezeigt werden. Und WordWrap gibt es nicht und auch nicht Autoellipsis. Ein ToolTip soll den gesamten Text des Item anzeigen.
    Klingt immer noch wild, aber na gut.
    Machst du Timer aufs Form timeToolTip Interval sagen wir mal 1000 (und Option Strict On)

    VB.NET-Quellcode

    1. Private Sub myListBox_MouseEnter(sender As Object, e As EventArgs) Handles myListBox.MouseEnter
    2. timeToolTip.Start()
    3. End Sub
    4. Private Sub myListBox_MouseLeave(sender As Object, e As EventArgs) Handles myListBox.MouseLeave
    5. timeToolTip.Stop()
    6. End Sub
    7. Private Sub timeToolTip_Tick(sender As Object, e As EventArgs) Handles timeToolTip.Tick
    8. myPoint = myListBox.PointToClient(Cursor.Position)
    9. myIndex = myListBox.IndexFromPoint(myPoint)
    10. If myIndex < 0 Then Exit Sub
    11. Dim curText = myListBox.GetItemText(myListBox.Items(myIndex))
    12. If ToolTip1.GetToolTip(myListBox) <> curText Then ToolTip1.SetToolTip(myListBox, curText)
    13. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    ErfinderDesRades schrieb:

    man kann doch einen beliebigen Text mit ToolTip.Show(<argument-liste>) anzeigen - wäre das nicht geeignet?
    Ich habe noch nie einen ToolTip benutzt, Show funktioniert auch einigermaßen, aber da habe ich irgendwie schlechte Zuverlässigkeit. Womöglich weil der ToolTipText nie aktualisiert wird. Deswegen wird Show bei jedem Timer.Tick aufgerufen und nicht nur dann, wenn das Item wechselt.
    Edit: Ah, bei Show bleibt der Text für eine gewisse Zeit angezeigt und verschwindet dann, das sorgt mit dem Timer für echt komisches Verhalten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ein DataGridView mit nur einer Spalte wäre auch ne Idee… kann man optisch komplett so reduzieren das es wie eine ListBox aussieht und ist dieser aber deutlich überlegen hinsichtlich der technischen Möglichkeiten.

    Die „Lösung“ mit dem Timer ist voll dirty :P
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Dann muss ich auch erst den Spaltenheader wieder Visible machen, und dann funktioniert der ToolTip nur beim Header, nicht bei den Zellen.

    Edit:
    Uff, wenn ich in eine Zelle fahre, das DGV verlasse und dann auf dem Column-Header das DGV wieder betrete, dann wird der ToolTip des Header und der Tooltip der gewählten Zelle angezeigt. Sonst gibts keinen ToolTip für Zellenwerte.
    Also das ist eher ein Graus.

    VB.NET-Quellcode

    1. Private Sub dgv_CellMouseEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellMouseEnter
    2. If e.RowIndex <= 0 Then Exit Sub
    3. ToolTip1.SetToolTip(dgv, dgv(e.ColumnIndex, e.RowIndex).Value.ToString)
    4. End Sub