IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Afficher ou masquer les ToolTipText d'un DATAGRIDVIEW


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut Afficher ou masquer les ToolTipText d'un DATAGRIDVIEW
    Bonjour à vous,

    Voilà mon problème:
    Dans un formulaire, j'ai un datagridview sur lequel j'affiche des tooltips.

    Le ToolTipText que j'affiche est personnalisé en fonction du contenu de la cellule survolée par la souris, je personnalise le texte en interceptant via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       Private Sub DataGridViewCalcul_CellToolTipTextNeeded(sender As Object, e As DataGridViewCellToolTipTextNeededEventArgs) Handles DataGridViewCalcul.CellToolTipTextNeeded
            ' Gestion de l'affichage des ToolTipText contextuels
    Tout va très bien dans le meilleur des mondes, sauf que sur certaines cellules du datagridview, je ne voudrais pas qu'il y ait de tooltip qui s'affiche.

    Pour rester simple on va dire que toutes ces cellules sur lesquelles je ne veux pas qu'il y ait de tooltip ont un contenu qui commence par @. J'ai donc cherché à ajouter dans la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub DataGridViewCalcul_CellToolTipTextNeeded
    le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               Case e.ColumnIndex <= EquationsDuladLocal(e.RowIndex).CountEqua - 1 AndAlso EquationsDuladLocal(e.RowIndex).Equation(e.ColumnIndex).Affiche Like "@*"
                                ' Inhibition du ToolTipText
                                e.ToolTipText = Nothing
    Quand je mets Nothing --> cela m'affiche le contenu de ma cellule.
    Quand je mets " " --> cela m'affiche un toolTip tout petit de 1 espace, mais ça m'affiche quand même quelque-chose.

    Y a t-il moyen de ne rien afficher du tout sur ces cellules et seulement celles-là?

    Accessoirement sur celles où je veux afficher quelque-chose, il y a moyen que l'affichage reste présent plus longtemps? Mais bon c'est une question subsidiaire, il faut peut-être ouvrir une autre discussion...

    Merci d'avance de vos réponses.
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    C'est bien Nothing qu'il faut utiliser mais au bon endroit ...

    Vois la vidéo : https://www.dropbox.com/s/pzcm0lz9nv...olTip.mp4?dl=0

    La difficulté, c'est que lorsqu'on supprime le ToolTip parce que la valeur est "@", il faut pouvoir le réactiver quand la valeur n'est plus "@".
    Dans mon exemple, c'est facile car mes ToolTipText peuvent être générés de manière automatique. Si ce n'était pas le cas, je pense qu'il faudrait encoder tous les textes des ToolTip dans un tableau de sorte à les récupérer facilement par leurs indices.

    Voici mon projet de test d'où est tirée la vidéo : ToolTipTest.zip.

    Très bonne journée ...

  3. #3
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour Phil Rob,

    Tout d'abord merci pour ta réponse et désolé pour le temps mis à te répondre.

    Grace à ton exemple je viens enfin de comprendre d'ou venaient ces AutoPopDelay, InitialDelay que je n'avais jamais compris où coder (enfin quand je les codais, je ne voyais pas comment associer le tooltip créé au DGV... ).

    Par contre il y a un truc qui me chiffonne par rapport à mon code:
    Comme les données dans mon DGV sont très nombreuses, il est déclaré en Virtualmode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            ' Déclaration du datagridview en mode virtuel
            Me.DataGridViewCalcul.VirtualMode = True
    De ce fait les données ne sont fournies que lors de lorsque l’événement CellValueNeeded est appelé (et la source de ce qui est affiché change en fonctions d'options en haut de mon formulaire, quand je change une de ces option, je n'ai pas des milliers de lignes à mettre à jour, mais seulement celles à l'écran, c'est pour ça que j'aime bien le VirtualMode).

    Donc je me dis que le code que tu as mis dans dans CellValueChanged, je pourrais bien le mettre dans mon CellValueNeeded, mais du coup j'ai un problème intellectuel avec la boucle où est affectée le TT dans la déclaration du toolTip:
    Pour un peu, j'oserai coder aussi ce que tu mets dans la Private Sub FixeToolTip dans mon CellValueNeeded en ne l'affectant qu'à la cellule concernée au lieu de la double boucle Lignes/Colonnes.

    Mais ce que j'ai du mal à conceptualiser c'est : Est-ce qu'il y a une différence (occupation mémoire entre autre) entre affecter le "même" TT à toutes les cellules du DGV via ton exemple de double boucle ou affecter un "nouveau" TT qui sera déclaré dans chaque appel de CellValueNeeded ?

    Je ne sais pas si je suis clair, mais il y a là un truc qui me dépasse.

    Si tu peux m'apporter une réponse la-dessus ce serait sympa mais encore une fois merci et le coup de la vidéo comme illustration de réponse, c'est la première fois que je vois ça mais c'est classe.
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir,
    J'ai fait le test pour répondre à ta question. Avant, j'avais utilisé le TT de diverses manières, mais jamais sur les cellules d'un DGV. Je découvre...
    Si je comprends bien, le DGV dispose d'un TT pour chacune de ses cellules. Il existe et est unique. L'utiliser ou pas ne change rien à la mémoire (sauf pour la chaîne de texte). Il n'y aurait donc pas lieu de se préoccuper : c'est toujours le même qui est utilisé, nous ne programmons pas de New pour les TT des cellules.
    Bonne nuit ...

  5. #5
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Le code que j'ai envoyé qui fonctionne sous l'événement CellValueChanged ne peut pas fonctionner sous l'événement CellValueNeeded car ce dernier se produit avant qu'il y ait une donnée à tester, et mon code a besoin que la donnée soit là.

    Mais pourquoi utiliser ce mode Vitual ?
    Si c'est pour ajouter les données manuellement, ce n'est pas nécessaire (tu peux tester cela su mon projet test en mettant les 3 DGV.Rws.Add en commentaire).
    Si le DGV est alimenté par un DataSource, le mode virtual n'est pas nécessaire non plus, et cela n'empêche pas d'ajouter des lignes manuellement mais sans programmation.

    Très bonne journée

  6. #6
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour Phil Rob

    J'utilise le VirtualMode car mon DGV contient quelques dizaines de milliers de lignes, et quand il y a beaucoup de données, ça va quand même beaucoup plus vite, y compris au chargement de l'écran contenant le DGV.

    Donc tes réponses m'ont fait bien réfléchir:
    - En effet dans le CellValueNeeded on peut bien affecter une valeur au ToolTipText, mais pas la valeur nothing
    - L'événement CellValueChanged n'est pas activé quand on affecte ce qu'il faut afficher via le CellValueNeeded
    - Le problème c'est que mon DGV n'est pas fait pour modifier les données qu'il contient, c'est un "tableau d'affichage" qui me sert à dessiner des logigrammes comme ci-dessous
    Nom : Contenu DGVCalcul.png
Affichages : 391
Taille : 72,2 Ko
    Seules les zones grises peuvent évoluer, et encore ce n'est pas par une mise à jour manuelle par l'utilisateur, c'est le programme qui rafraîchit le contenu.
    - Les toolTiptext que j'utilise c'est pour donner des infos supplémentaires sur les cellules qui contiennent des choses comme S7, M800, R391, les autres cellules c'est du texte ou j'utilise des codes @, @@, @@@... pour indiquer au code que quand on fait le CellPaint, il faut mettre des mises en formes particulières du genre texte gras sur plusieurs lignes, Texte centré sur plusieurs colonnes...
    - Alors du coup, je me suis dit "Pas bête le gars, je vais essayer de coller ça dans un autre événement de la cellule où la donnée est déjà là". J'ai essayé le CellMouseEnter, CellPaint: Si je mets "blabla" dans le ToolTipText, ça marche, si je mets nothing dans le tooltipText, ça ne marche pas.
    - Le pire c'est que quand ma souris passe au dessus d'une cellule qui ne contient qu'un nombre je n'ai pas d'aide qui s'affiche alors que dans mon code dans le CellToolTipTextNeeded c'est géré comme les cellules avec des @: Je ne renvois rien parce que toutes mes boucles de test ne matchent pas. Et ben y en a où il réussit à ne rien afficher et d'autres non...

    Je crois que je ne vais pas user le soleil la-dessus, je vais mettre 1 espace dans la chaîne affectée au ToolTipText, ça fait juste un petit carré jaune, c'est moins pire.

    C'est dommage qu'on ne puisse pas faire le e.handled comme dans certains événements pour les annuler.

    Merci pour le coup de main Phil Rob.
    Images attachées Images attachées  
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  7. #7
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour Sibama,

    Dommage que ce ne marche pas ... bien ...

    Mais en matière d’événements à utiliser dans le DGV Virtual, n'y a-t-il pas un événement qui s'active lorsqu'une cellule a reçu une info ou un rafraîchissement ? Là, mon code devrait fonctionner ...

    Si non, à défaut de Nothing, plutôt que de mettre un "blanc" dans le TT, peut-être que String.Empty réduirait ton petit carré jaune à presque rien.

    Bonne continuation

  8. #8
    Membre du Club Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 147
    Points : 55
    Points
    55
    Par défaut
    Bonjour Phil Rob,

    Merci pour tes réponses.

    Le string.empty ne marche pas, ça donne aussi le contenu de la cellule (idem au Nothing).

    Comme ça me pique un peu quand je ne réussi pas quelque chose, j'ai un peu insisté:
    Tout d'abord dans la littérature sur les DGV en Virtual Mode chez microsoft, il est bien écrit qu'on ne peut pas mettre string.empty ou nothing si on utilise le CellValueNeeded. Bon ben comme ça c'est réglé.

    Et puis ton idée sur les événements ça m'a titillé et j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       Private Sub DataGridViewCalcul_CellMouseEnter(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewCalcul.CellMouseEnter
     
            ' Gestion des ToolTip pour ne pas afficher la bulle quand il n'y a rien d'intéressant à signaler
            If Me.DataGridViewCalcul.Item(e.ColumnIndex, e.RowIndex).Value Like "@*" Then
                Me.DataGridViewCalcul.ShowCellToolTips = False
            Else
                Me.DataGridViewCalcul.ShowCellToolTips = True
            End If
     
        End Sub
    Et là ça marche

    C'est un peu bourrin d'activer/désactiver directement l'ensemble des tooltip du DGV, mais peu importe, ça marche.

    Encore merci pour le coup de main.
    Ce n'est pas parce que l'on allume la bougie de quelqu'un avec sa lanterne que l'on se prive de lumière.

  9. #9
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bravo !!!
    Ici le temps est super. Chez toi aussi je suppose.
    J'espère que tu peux vivre le confinement au jardin ...
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher et masquer les lignes d'un JTable sous java
    Par samarqand dans le forum Composants
    Réponses: 1
    Dernier message: 12/06/2016, 12h55
  2. [VB.Net] Masquer les lignes dans un DataGridView
    Par xweb-10 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/06/2011, 20h29
  3. Réponses: 2
    Dernier message: 31/01/2008, 15h48
  4. Réponses: 5
    Dernier message: 13/10/2005, 19h33
  5. Comment afficher les toolTipText dans une zone de statut ?
    Par nicok01 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/01/2005, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo