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

Windows Forms Discussion :

[C#] TreeView Click Event


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut [C#] TreeView Click Event
    Bonjour,

    Je suis en presence d'un TreeView classique qui utilise des images pour chaque noeud (genre explorateur Windows).

    Je voudrais pouvoir recuperer un clic sur l'image du TreeView seulement. Pas sur la petite croix Expand, ni sur le label mais un click sur l'image du noeud seulement.

    NOTE : Pour l'instant j'arrive bien entendu à recuperer un click sur le noeud complet (Petite Croix + Image + Label) mais sans pouvoir déterminer si la clic a eu lieu sur l'image ou sur la petite croix ou sur le label...

    Merci d'avance.

    Laurent

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Peux tu nous expliquer dans quel interêt, quel but :

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    Biensur,

    C'est assez simple. Je voudrais que :

    - Lorsque l'utilisateur clique sur la petite croix, l'arbre se developpe (expand).

    ET

    - Lorsque l'utilisateur clique sur l'image, une modal Dialog s'ouvre pour afficher certains détails sur le noeud clické. (par exemple des details sur le repertoire correspondant au noeud si on faitr un parallèle avec l'Explorateur Windows)


    Mon problème c'est que pour l'instant ma boite de Dialog (modal) s'ouvre aussi lorsque l'utilisateur clique sur la petite croix. Et je voudrais bien qu'elle s'ouvre uniquement lorsque je clique sur l'image du noeud.

    Voila, j'espère que ça donne un peu plus de sens à ma question. Merci

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Et pourquoi ne pas ajouter cette fonctionnalité dans le contextmenu (click droit) du noeud :
    ou alors directement dans une infobulle du noeud

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    Ce sont 2 bonnes suggestions mais :

    - L'infobulle ne suffit pas, il faut vraiment une boite de dialogue car des données peuvent etre modifiées concernant le noeud.

    - Le contextmenu est la solution que j'avais choisie au depart (faute de savoir faire autrement) mais il faut faire un clic supplementaire (et oui les informaticiens sont paresseux...). Plus serieusement, c'est juste un poil moins conviviale et un peu moins rapide.

    Par contre je me suis dit (mais je connais pas du tout) que je pourrais faire un custom control qui reprendrait un TreeView et aurais un Button à la place de l'image sur laquelle je n'arrive pas à recupérer le clic. Ceci autoriserait de cliquer sur les Buttons du TreeView de manière indépendante.

    Est ce que c'est possible de faire ça ? C'est facile ou c'est un truc de fou ?

    Merci en tout cas neguib pour tes suggestions pertinentes.

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Bonne idée, le nec alors serait un ImageButton
    bon je regarde de mon côté et je te dis, normalement cela doit être possible mais à mon avis ce ne sera pas simple

  7. #7
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Mais c'est exactement ce que je fais avec mon tree
    Un click sur le + = expand
    un click sur l'image = ouverture d'un child form

    c'est bien ca que tu veux ?

    dans ce cas, tu assignes au tag le type de form que tu veux ouvrir, et le tour est joué. Pas besoin de faire plus compliqué.

  8. #8
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    et tu peux pas regarder lors du OnClick, quels sont les coordonnées de la souris, et les comparer avec les coordonnées X et Y du début de l'affichage du nom du noeud. (tu peux peut-être en l'occurence te servir de la valeur du Indent ajoutée à la taille de l'image, multiplié par le niveau du noeud)

  9. #9
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Citation Envoyé par bel.laurent
    - Le contextmenu est la solution que j'avais choisie au depart (faute de savoir faire autrement) mais il faut faire un clic supplementaire (et oui les informaticiens sont paresseux...).
    Ben pas forcement, tu peux résoudre le problème très simplement en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void TView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    	if(e.Button == MouseButtons.Right)
    	{
    		TViewPatch.SelectedNode = TViewPatch.GetNodeAt(e.X,e.Y);
    	}
    }
    Ca sélectionne le noeud sur lequel tu cliques avec le bouton droit de la souris.

    @+

  10. #10
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    Merci pour toutes ces suggestions !

    ans ce cas, tu assignes au tag le type de form que tu veux ouvrir, et le tour est joué. Pas besoin de faire plus compliqué.
    Je veux bien que tu donnes un peu plus de details la dessus. Ca marche qd meme pas tout seul comme par magie ? Si ? Je vais essayer de suite ton truc mais s'il y a des details à rejouter alors je veux bien en savoir plus (genre evenement qui est levé...).


    et tu peux pas regarder lors du OnClick, quels sont les coordonnées de la souris, et les comparer avec les coordonnées X et Y du début de l'affichage du nom du noeud. (tu peux peut-être en l'occurence te servir de la valeur du Indent ajoutée à la taille de l'image, multiplié par le niveau du noeud)
    C'est pas mal comme idée. Pas très joli comme façon de proceder mais ça doit sans aucun doute marcher. Merci Harry pour cette idée, je ferais ça si je trouve rien de plus propre.


    Ca sélectionne le noeud sur lequel tu cliques avec le bouton droit de la souris.
    Je suis entièrement d'accord SLE, ça selectionne bien le noeud (c'est ce que j'utilise). Mais par contre (et c'est là tout le probleme) l'evenement est levé même si tu cliques sur la petite croix et le noued est trouvé ! Ce qui ne resoud en rien mon soucis. Qd je disais qu'il y avait un clic en +, je parlais du clic sur le contextMenu


    Encore merci à tous.
    Laurent

  11. #11
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Lorsque je clique sur le + d'un node, ca expand le node mais ça ne le selectionne pas. Je ne me souviens pas avoir fais quoi que ce soit de spécial pour ça.

    Lorsque je clique sur le node (l'image), là je récupère le tag assigné au node lors de sa création ce qui me permet de savoir quel genre de form je dois ouvrir. Tu peux assigner au tag une structure par exemple dans laquelle tu stockes toutes les informations concernant ton image, puisque c'est ça qui t'interesse.

    @+

  12. #12
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    Lorsque je clique sur le + d'un node, ca expand le node mais ça ne le selectionne pas. Je ne me souviens pas avoir fais quoi que ce soit de spécial pour ça.
    Ce que tu as dit m'a mis la puce à l'oreille. Il ne faut utiliser l'evenement de clique souris mais un autre evenement, mais lequel ???

    - MouseUp est levé pour un clic sur la petite croix, l'image et le texte d'un noeud
    - AfterSelect est levé si on selectionne l'objet, c'est à dire un clic sur image ou sur le texte (on se rapproche)

    Mais quel evenement utiliser pour que seul un clic sur l'image soit source d'un evenement ??? Tu utilises quoi toi ?


    Ton idée du Tag est très bonne ! A l'origine le tag est fait pour stocker un object contenant des infos suplémentaire mais y sotcker le type de la form à afficher est bien pensé.

    Merci

  13. #13
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    tention c'est du lourd :

    ici :
    http://www.developpez.net/forums/vie...light=#2294039

    J'ai dû aller structer la gestion des évennements intèrnes au composant treeview, parceque je ne voulait pas que le noeud s'autoexpand suite à un doubleclique.

    Et bien je suppose qu'à ce même endroit, il t'est possible de récupérer le mousedown avant toute interprétation intèrne du treeview, et après tu as le temps de le traiter comme tu veux (récupérer la position de la souris etc...), et éventuellement d'autoriser que le click soit pris en charge par le treeview ou pas (et dans ce cas c'est à toi de définir un delegate OnImageclick()) que renverra ton composant hérité du treeview.

    Voila, mais tu sais je ne crois pas que tu puisses te passer de gérer le mouse_down et de calculer la position de la souris par rapport à l'indentation.

  14. #14
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Ceci fonctionne pour des dimensions classiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    private void TreeView1_MouseDown(object sender, MouseEventArgs e)
     {
        Point p = new Point(e.X, e.Y);
        TreeNode n = this.TreeView1.GetNodeAt(p);
        Rectangle imgRectangle;
        if (n !=null)
         {
           imgRectangle = new Rectangle(n.Bounds.X - 19, n.Bounds.Y, 16, 16)
           if (imgRectangle.Contains(p))
             {
                //traitement du Dialog avec les infos de n
             }
         }
     }

  15. #15
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    tention c'est du lourd
    Ca m'a presque fait peur de lire tout ça Harry_polin. En tout cas chapeau, la discussion avait pris une tournure assez subtile et c'est d'autant plus interessant que mon control derive d'un TreeView ! La question du double click m'avait efleuré l'esprit et je crois que ce thread va me servir assez rapidement.

    Je crois que je vais suivre les conseils de Harry_polin et Neguib et comparer la position de la souris avec la position de l'image par rapport à l'indentation. D'autant plus que le code de neguib est convainquant en terme de taille.

    Merci à tous pour votre aide. Je marque ce post comme résolu dans la mesure où une solution à été trouvée mais si qqun a un mot à ajouter...

    Laurent

  16. #16
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    Petite précision pour eviter de chercher trop longtemps, le rectangle que neguib utilise dans le cas super générique (testé avec des valeurs de fou) sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    			Rectangle imgRectangle = new Rectangle(
    				selectedTreeNode.Bounds.X - treeView.ImageList.ImageSize.Width,
    				selectedTreeNode.Bounds.Y + ((treeView.ItemHeight - treeView.ImageList.ImageSize.Height) / 2),
    				treeView.ImageList.ImageSize.Width,
    				treeView.ImageList.ImageSize.Height);
    [/code]

    En effet, il faut tenir compte de la taille des images (treeView.ImageList.ImageSize) mais aussi de la taille verticale de chaque noeud de tree (treeView.ItemHeight). La valeur de l'indentation n'intervient pas car elle est dejà prise en compte dans selectedTreeNode.Bounds.X

    Pour ceux qui ne me croyent pas, je vous laisse essayer avec un Indent de 100 et un ItemHeight de 200 pour le treeView et des images de 10 par 10. Vous verrez que ca tombe pile poil.

    Voila c'est un peu lourd mais ça marche, yyyooouuuuuppppiiiii !!!!!!

    Merci encore les gars ! Je vais pouvoir aller me coucher en paix ce soir.

  17. #17
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Donc en final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    private void TreeView1_MouseDown(object sender, MouseEventArgs e) 
     { 
        Point p = new Point(e.X, e.Y); 
        TreeNode selectedTreeNode = this.TreeView1.GetNodeAt(p); 
        Rectangle imgRectangle; 
        if (selectedTreeNode !=null) 
         { 
           imgRectangle = GetNodeIconeRectangle(selectedTreeNode) 
           if (imgRectangle.Contains(p)) 
             { 
                //traitement du Dialog avec les infos de selectedTreeNode
             } 
         } 
     }
     
    private Rectangle GetNodeIconeRectangle(TreeNode node) 
     { 
        Size s = node.TreeView.ImageList.ImageSize;
        int h = node.TreeView.ItemHeight;
        int x = node.Bounds.X - s.Width;
        int y = node.Bounds.Y + ((h - s.Height)/2);
        return new Rectangle(new Point(x, y), s);
     }
    encore faut-il qu'il y ait une ImageList

  18. #18
    Membre régulier
    Inscrit en
    Octobre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 10
    Par défaut
    En effet c'est plus propre comme ça.

    Merci neguib.

  19. #19
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par bel.laurent
    En effet c'est plus propre comme ça.
    Merci neguib.

    En fait mon avertissement serait d'ajouter des conditionnelles sur les NullReferences possibles:
    • node
      node.TreeView
      node.TreeView.ImageList

    Pour pouvoir l'implementer dans une petite dll TreeViewManager en tant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static Rectangle GetNodeIconeRectangle(TreeNode node)

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

Discussions similaires

  1. [AC-2010] click event d'un treeview inactif
    Par vandrie dans le forum IHM
    Réponses: 3
    Dernier message: 07/09/2012, 19h52
  2. Appel de méthode sur Click event
    Par Ant8386 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/11/2006, 12h10
  3. [C#]probleme avec un node click event
    Par zmerli dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/10/2006, 17h37
  4. [VB.Net] call click event
    Par Cirdan Telemnar dans le forum VB.NET
    Réponses: 10
    Dernier message: 30/05/2006, 14h49
  5. Réponses: 2
    Dernier message: 02/12/2005, 17h22

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