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

C# Discussion :

Problème avec TreeView.Sort() [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Problème avec TreeView.Sort()
    Bonjour,

    Suite à un précédent message, j'ai décidé d'utiliser un TreeView pour afficher une collection d'objets.

    J'ai une classe Site (Nom, Pays, Continent, SN) dont j'enregistre les instances dans une ArrayList qui est enregistrée dans les Settings de mon programme :

    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
        public class Site
        {
            public string Nom { get; set; }
            public string Pays { get; set; }
            public string Continent { get; set; }
            public string Sn { get; set; }
     
            public Site(string _nom, string _pays, string _SN)
            {
                this.Nom = _nom;
                this.Pays = _pays;
                this.Sn = _SN;
                if (MRADLL.StaticFunctions.europe.Contains(_pays))
                    this.Continent = "Europe";
                else if (MRADLL.StaticFunctions.northAmerica.Contains(_pays))
                    this.Continent = "North America";
                else
                    this.Continent = "Rest of World";
            }
    }
    J'ai une classe TreeItem (Name, Level) qui me permet d'avoir le .Text de mon futur node et son niveau dans le TreeView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public class TreeItem
        {
            public string Name { get; set; }
            public int Level { get; set; }
            public TreeItem(string name, int level)
            {
                this.Name = name;
                this.Level = level;
            }
        }
    Voici ma fonction pour remplir le TreeView :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
            public void FillTreeView()
            {
                List<TreeItem> items = new List<TreeItem>();
     
                foreach (Site oSite in MyApp.Properties.Settings.Default.savedSites)
                {
                    TreeItem contTree = new TreeItem(oSite.Continent, 0);
                    TreeItem paysTree = new TreeItem(oSite.Pays, 1);
                    TreeItem nomTree = new TreeItem(oSite.Nom, 2);
     
                    TreeItem contResult = items.Find(delegate(TreeItem t) { return t.Name == oSite.Continent; });
     
                    if (contResult == null)
                        items.Add(contTree);
     
                    TreeItem contResult2 = items.Find(delegate(TreeItem t) { return t.Name == oSite.Continent; });
                    TreeItem paysResult = items.Find(delegate(TreeItem t) { return t.Name == oSite.Pays; });
     
                    if (paysResult == null)
                        items.Insert(items.IndexOf(contResult2) + 1, paysTree);
     
                    TreeItem paysResult2 = items.Find(delegate(TreeItem t) { return t.Name == oSite.Pays; });
                    TreeItem nomResult = items.Find(delegate(TreeItem t) { return t.Name == oSite.Nom; });
     
                    if (nomResult == null)
                        items.Insert(items.IndexOf(paysResult2) + 1, nomTree);
                }
     
                SitesTreeView.BeginUpdate();
                SitesTreeView.Nodes.Clear();
     
                int n = 0;
                int m = 0;
                int p = 0;
     
                foreach (TreeItem item in items)
                {
                    if (item.Level == 0)
                    {
                        TreeNode t = new TreeNode(item.Name);
                        t.NodeFont = new Font(this.Font.ToString(), 10, FontStyle.Bold);
                        SitesTreeView.Nodes.Insert(n, t);
                        n++;
                        m = 0;
                    }
                    if (item.Level == 1)
                    {
                        TreeNode t = new TreeNode(item.Name);
                        t.NodeFont = new Font(this.Font.ToString(), 9, FontStyle.Bold);
                        SitesTreeView.Nodes[n - 1].Nodes.Insert(m, t);
                        m++;
                        p = 0;
                    }
                    if (item.Level == 2)
                    {
                        TreeNode t = new TreeNode(item.Name);
                        t.NodeFont = new Font(this.Font.ToString(), 8);
                        SitesTreeView.Nodes[n - 1].Nodes[m - 1].Nodes.Insert(p, t);
                        p++;
                    }
                }
                SitesTreeView.Sort();
                SitesTreeView.EndUpdate();
            }
    Bon, il y a sans doute plus simple, mais c'est comme ça que j'aie réussi à le faire marcher.

    Au démarrage de l'app, j'instancie quelques sites, les ajoute à mon Setting et génère le TreeView. Cela donne :



    En revanche, si j'ajoute un site pendant le runtime, j'obtiens :



    C'est le bordel dans le TreeView (alors qu'en mettant un point d'arrêt, et en vérifiant la liste "Items", celle-ci est correcte, dans l'ordre qu'il faut).

    Si j'enlève le SitesTreeView.Sort(); ça fonctionne, il n'y a plus de bordel, par contre mes nodes ne sont plus triés dans l'ordre alphabétique.

    Auriez-vous une idée du pourquoi du comment ? Je n'arrive pas à trouver le problème.

    Merci d'avance !

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Points : 179
    Points
    179
    Par défaut
    Bonjour,

    Dès lors que tu as fait un SitesTreeView.Sort(), la propriété SitesTreeView.sorted est à true.
    A partir de là, a chaque insert de node, le treeview est intégralement retrié, et au vu de la façon dont tu construit ton arbre ça peux plus marcher.

    Tu insères par exemple dans l'ordre :
    Europe, Andorre, Andorre1
    Europe, France, Paris
    Europe, Belgique, Bruxelles

    Sur les deux première lignes tout va bien, sauf qu'en suite tu insères la Belgique en 3eme position, et Bruxelles dans le pays en 3eme position.

    Il va insérer la Belgique, et là c'est le drame.
    Ton arbre est retrié.
    Les pays d'Europe vont se retrouver dans l'ordre alphabétique:
    Andorre, Belgique, France.

    Sauf que là tu insères Bruxelles dans le 3ème pays dont l'ordre à changé entre-temps -> La France hérite de Bruxelles.

    Et là c'est le bordel dans ton Treeview

    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SitesTreeView.BeginUpdate();
    SitesTreeView.Nodes.Clear();
    SitesTreeView.Sorted = false;
    Avant de construire ton arbre et tu laisse le .Sort() à la fin.
    Histoire de faire un seul tri une fois l'arbre complété

    Cordialement,
    MvK

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut


    C'était ça !

    Merci infiniment ! Je n'aurais jamais trouvé ça tout seul !

    Merci beaucoup, c'était simple et efficace ! As-tu déjà rencontré ce problème ? Parce que je n'avais vu nulle part dans la doc que cela lui faisait trier à chaque modif !

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 87
    Points : 179
    Points
    179
    Par défaut
    C'est un peu caché mais msdn le mentionne :

    http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx

    Dans les Remarques :

    Remarks

    If the TreeView.Sorted property is set to true, the index parameter value is ignored. The TreeNode is inserted into the tree view and the TreeView resorted.
    Après le fait que le tri marche une fois mais pas deux m'a mit la puce à l'oreille.

    MvK

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Ahah, exact !

    Par contre dans la
    page de TreeView.Sort()
    ce n'est pas indiqué !

    Merci encore, et bien joué

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/05/2012, 10h24
  2. Problème avec Collection.sort
    Par IMPRO dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 04/02/2012, 12h00
  3. Problème avec treeview
    Par walid kh dans le forum VB.NET
    Réponses: 4
    Dernier message: 19/04/2010, 18h15
  4. [c#]problème avec treeview
    Par fafa139 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/06/2006, 08h43
  5. Problème avec Virtual Treeview
    Par bisounoursbleu dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/12/2004, 15h37

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