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

  • VB.NET

Es gibt 19 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
    Hi Zappel, ich wende ja deinen Tipp mit dem Timer an.

    Eigenartigerweise funktioniert der Code beim meinem ersten Programm super. Der Tooltip wird sehr schön angezeigt.

    Nun benutze ich den vollkommen selben Code bei einem anderen, zweiten Programm. Der Tooltip wird zwar mit gewünschtem Text angezeigt, positioniert genau unten am Mauszeiger, aber: diesmal "blinkt" er ständig, bis er sozusagen abgeschaltet wird.

    Woran kann diese Blinken liegen, wie kann man es vermeiden?

    Grüße - Dietrich
    Es ist mir eben unerklärlich - die Timer sind vollkommen identisch bei jedem der zwei Programm eingestellt (100ms). Auch die Routinen zur Darstellung des Tooltips sind identisch von mir übernommen worden.
    Im zweiten Programm blinkt der Tooltip in hoher Frequenz (100ms)...??

    Ergänzung: Es sieht so aus, als ob der Tooltip ständig Position und Größe ändert... was wie blinken aussieht.

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

    Hello!

    Ich habe meinen Fehler gefunden. Der Tooltiptext ist bei diesem Programm aus zwei Teilen zusammengesetzt. Das habe ich bei der Abfrage bein Timer "If ToolTip1.GetToolTip(lstFolders) <> fol & curText Then" nicht beachtet.... habe nur CurText abgefragt. ;)
    OK, alles läuft.

    Ciao - Dietrich
    Du hast den falschen Event, der MouseMove Event sollte das gewünschte Ergebnis bringen:

    VB.NET-Quellcode

    1. Private Sub myListBox_MouseMove(sender As Object, e As EventArgs) Handles myListBox.MouseMove
    2. Dim point = myListBox.PointToClient(Cursor.Position)
    3. Dim index = myListBox.IndexFromPoint(point)
    4. If index < 0 Then Return
    5. Dim item = myListBox.Items(index)
    6. toolTip.SetToolTip(myListBox, item.ToString())
    7. End Sub
    Kommt mir auch komisch vor, in jedem MouseMove den ToolTip zu setzen.

    Ich bekomme langsam Lust auf eine Test-Anwendung, die den Fehler reproduziert.
    Da könnte ich versuchen, das in post#5 gesagte zu demonstrieren: Nämlich, dass ToolTip.SetToolTip() der falsche Dampfer ist, und mit ToolTip.Show() wirds ganz einfach.
    Es ist erstmal egal ob SetToolTip oder Show, da könnte auch ein count += 1 stehen. Fakt ist ohne Timer oder MouseMove kriegst du kein count = 2, wenn du das Element wechselst. Du musst die gesamte Listbox verlassen.
    Wobei ich MouseMove sehr hart finde.
    Aber mit MouseMove sieht man sehr gut den Unterschied zwischen SetToolTip und Show. Die Show Methode hat irgendein Problem mit der Aktualisierung.