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 :

Dérivée de TreeView


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut Dérivée de TreeView
    Bonjour,

    J'aimerai construire un treeview dont les éléments sont personnalisés : par exemple, au lieu que la propriété Text renvoi une string basique, je voudrais que ça renvoi en fait une concaténation d'une string et d'un entier... donc en bref rajouter un membre int... Voici le code (jai viré le superflu) :

    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
    25
    26
    27
    28
    29
    30
    31
    32
     public class ComptaTreeView : System.Windows.Forms.TreeView
        {
            ComptaTreeNodeCollection _Nodes;
     
            public ComptaTreeNodeCollection Nodes
            {
                get
                {
                    return _Nodes;
                }
                set
                {
                    _Nodes = value;
                }
            }
     
        }
     
     
        class ComptaTreeNodeCollection : System.Windows.Forms.TreeNodeCollection
        {
     
     
        }
     
     
        public class ComptaNode : System.Windows.Forms.TreeNode
        {
            private int value;
     
     
        }
    et là il me dit "TreeNodeCollection has no constructor" ... alors que c'est possible de dériver une classe sans constructeur...

    Si qq'un a une ptite idée, grand merci!

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Tu ne dois pas dérivé de TreeView mais créer des objets dérivant de TreeNode. Dans ce node à toi, du override la méthode ToString() si tu veut modifier l'affichage dans le TreeView.

  3. #3
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    il me semble que c'est ce que j'ai fait.... sauf que l'override n'est pas écrit...

    jai oublier de preciser que l'erreur se situe au niveau de la definition de la classe ComptaTreeNodeCollection

  4. #4
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    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
     
    class MyTreeNode : TreeNode
        {
            private int m_id;
     
            public int Id
            {
                get { return m_id; }
                set { m_id = value; }
            }
     
            public override string ToString()
            {
                return String.Format("{0}. {1}", Id, base.ToString());
            }
        }

  5. #5
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    merci, mais le probleme n'est pas là!
    une fois que ma classe TreeNode est faite, il faut que je la fasse remonter jusqu'à TreeView, donc en faisant encore 2 classes dérivés (dérivées de TreeNodeCollection et enfin de TreeView)

    ou alors suis-je completement a coté de la plaque?

  6. #6
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Sur TreeNodeCollection, méthode Add:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void Add (
    	TreeNode child
    )
    Donc, tu peux ajouter n'importe quel objet de type TreeNode ou dérivé (notion OO). Vu que tu as overridé ToString, lorsque ton contre TreeView voudra dessiner les noeud, il appellera ta méthode à affichera ce que tu auras décider.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    j'ai l'impression que tu n'as pas bien compris mon probleme, il s'agit d'un probleme de constructeur : lorsque je derive la classe TreeNodeCollection, le compilateur me dit que "the type TreeNodeCollection has no constructor"...

  8. #8
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    C'est tout à fait normal comme message d'erreur vu que le constructeur de TreeNodeCollection est internal!

    Mais tu n'as pas besoin de dériver de lui.

    Si j'ai bien compris ton problème, tu veux afficher un texte personnalisé pour chaque TreeNode de ton TreeView. Donc, tu créer ton TreeNode dont tu override la méthode ToString(). Le framework s'occupe du reste.

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    La classe class TreeNodeCollection ne possède pas de constructeur. Or lorsque tu dérives de TreeNodeCollection, par défaut, dans ta classe, si tu ne définis pas explicitement le constructeur, il essaie d'en générer un automatiquement. Il est de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public MaTreeNodeCollection() : base()
    {}
    Dans ce cas, c'est le base() qui échoue, car le constructeur n'existe pas.
    Essaie de définir un constructeur dans ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public MaTreeNodeCollection()
    {}
    EDIT : avec la réponse de neptune
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    Citation Envoyé par neptune Voir le message
    Donc, tu créer ton TreeNode dont tu override la méthode ToString(). Le framework s'occupe du reste.
    alors là je panne pas... a tout hasard jai créer une classe dérivée de treenode pour surcharger ToString() et uniquement ça... et comme je my attendais ce n'est pas ma méthode qui est appellée...

    une fois que j'ai créée la classe MyTreeNode, il faut bien qu'il y est un lien vers la classe TreeView... il me manque peut-etre un mot clé???

    EDIT : l'idée de court-circuité le constructeur de base est pas mal, mais ne fonctionne pas ici...

  11. #11
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Ce que je te racontais fonctionne pour les ListView, et apparement, c'est différent pour les TreeView. Désolé de t'avoir induit en erreur. Je dois quitter le bureau et si demain personne n'a pu aider, je tâcherai de trouver une solution.

  12. #12
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    ok c'est cool merci
    et si tu pouvais m'en dire un poil plus sur "le framework s'en occupe tout seul" jsuis preneur

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Citation Envoyé par OjBarbare Voir le message
    alors là je panne pas... a tout hasard jai créer une classe dérivée de treenode pour surcharger ToString() et uniquement ça... et comme je my attendais ce n'est pas ma méthode qui est appellée...

    une fois que j'ai créée la classe MyTreeNode, il faut bien qu'il y est un lien vers la classe TreeView... il me manque peut-etre un mot clé???

    EDIT : l'idée de court-circuité le constructeur de base est pas mal, mais ne fonctionne pas ici...
    Salut,

    en fait lors d'un dessin automatique du treeview, la representation textuelle n'est pas le ToString() de ta node mais sa propriété (non virtuelle) Text (Merci Reflector !), donc pour faire ce que tu souhaites (dans ce post du moins), tu peux essayer ca :

    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
    25
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
                this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
            }
     
            void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
            {
                e.Graphics.DrawString(e.Node.ToString(), treeView1.Font, Brushes.Black, e.Bounds.Location);
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < 10; i++)
                {
                    MyTreenode mtn = new MyTreenode("Essai");
     
                    treeView1.Nodes.Add(mtn);
                }
            }
        }
    Avec cette derivée de TreeNode :

    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
     
        class MyTreenode : TreeNode
        {
            static int compteur = 0;
            int numero;
     
            public MyTreenode(string text) : base(text)
            {
                numero = ++compteur;
            }
     
            public override string ToString()
            {
                return string.Format("Node {0}, numero : {1}", this.Text, numero);
            }
     
     
        }
    Pour le framework s'en occupe, je pense qu'il voulu dire que souvent les representations textuels d'un objet sont obtenu par un ToString() (mais pas ici =p).

    Bon courage.

  14. #14
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    ok merci bien, ça marche nikel
    par contre, pour récupérer la valeur du membre "numéro" je suppose que je dois faire la meme chose, mais avec la méthode onclick??

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    La j'avoue que je ne comprends pas trop la question. J'essaie quand meme =D

    Si tu veux recuperer la valeur de numero, tu fais un accesseur sur numero dans MyTreenode et dans l'event NodeMouseClick de ton TreeView tu peux faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                int valeurRecuperée = (e.Node as MyTreenode).Numero;
            }

  16. #16
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    oui oui tu as bien compris la question!
    pour que la fonction que tu indiques soit appellée au moment du click j'ai rajouter ça (t'as vu japprend vite ^^):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.trvCompta.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
    Mais tu m'a mis sur la piste d'une solution plus simple avec ce type de cast que je connaissai pas (oui je débute en dotnet ^^) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void trvCompta_AfterSelect(object sender, TreeViewEventArgs e)
            {
                tbxSection.Text = (e.Node as MyTreenode).numero.ToString();
            }
    merci pour cette aide!

  17. #17
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    un dernier pti détail : lorsque je selectionne un noeud, le cadre de selection fait la longueur de la chaine "normalement" contenue dans le noeud, et pas la logueur totale avec le rajout.... et je n'arrive pas a faire en sorte que le cadre soit plus grand... je suppose qu'il faut passer par l'evennement Nodemouseclick... mais jen sais pas plus
    merci pour cette derniere aide

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    pour l'event, oui desolé, en effet j'avais oublié de le preciser.

    pour le probleme du rectangle de selection, msdn te donnera un debut de solution dans sa page sur la propriété drawmode du control TreeView.

    Pour le cast, un as Truc te renvoie l'objet casté si c'est possible, sinon te renvoie null (donc tester la nullité potentiel est une bonne chose, si ton cast peut echouer).

    Bon courage. =)

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

Discussions similaires

  1. TreeView et menu contextuel...
    Par agh dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/04/2009, 12h23
  2. Custom control qui dérive d'un treeview
    Par chris81 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 05/02/2009, 14h31
  3. Réponses: 5
    Dernier message: 09/01/2003, 11h55
  4. où y a t il un tutorial pour le Treeview ??
    Par silvermoon dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h30
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    Réponses: 7
    Dernier message: 31/08/2002, 01h44

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