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 !