TreeView Collection et Index [Résolu]

Messages postés
3
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
6 octobre 2009
- - Dernière réponse : sdfsdf
Messages postés
3
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
6 octobre 2009
- 6 oct. 2009 à 00:42
Bonsoir, je suis en BTS IG et je travaille sur un projet de PTI. Ce dernier est une sorte de Quizz qui gère des questions, organisés en sous-thème, eux même organisés en thèmes.

Par exemple :
Thème > Sous-Thème > Liste de questions
Histoire > 1er Empire > la bataille d'Austerlitz

Pour se faire, j'ai trois classes Theme, SousTheme et Question.

Dans un Form j'ai d'un coté un TreeView qui affiche les thèmes et les sous-thèmes, de l'autre une lstBox qui affiche les listes de questions associés aux sous-thème choisi.


Pour remplir le TreeView, je passe par deux collection :

[b]
private SortedList<String, SousTheme> lesSousThemes = new SortedList<String, SousTheme>();

private SortedList<String, Theme> lesThemes = new SortedList<String, Theme>();
/b


J'ajoute un thème dans la collection :

private void majListe()
{

tvThSTh.Nodes.Clear();

foreach (Theme letheme in this.lesThemes.Values)
{
//Création d'un noeud Root
this.tvThSTh.Nodes.Add(new TreeNode(letheme.getTheme()));
}

foreach (SousTheme leSousTheme in this.lesSousThemes.Values)

foreach (Theme letheme in this.lesThemes.Values)
{
if (leSousTheme.getnomTheme() == letheme.getTheme())
{
this.tvThSTh.Nodes[letheme.getThemeIndex()].Nodes.Add(new TreeNode(leSousTheme.getSousTheme()));
}
}
}

}


Le problème qui me tracasse est que si par exemple j'ajoute une Catégorie qui n'est pas en bout de liste, elle recevra toutes les sous-catégorie de la Catégorie de l'indice qu'elle a remplacée.

Par exemple voici l'étape initiale :

AAA
- Sous Cat1
- Sous Cat2

BBB
- Sous Cat 1

Si j'ajoute une catégorie alphabétiquement classée au dessus voilà le résultat :

000
- Sous Cat1
- Sous Cat2

AAA
- Sous Cat 1

BBB

Je galère depuis des heures, j'espère que quelqu'un a une idée brillante pour m'aider à associer les sous-catégories à la bonne catégorie...

Merci d'avance ! :)
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
25
3
Merci
Bonjour

En effet, comme tu utilises l'index du theme pour lui ajouter les sous themes,
this.tvThSTh.Nodes[letheme.getThemeIndex()].Nodes.Add(new TreeNode(leSousTheme.getSousTheme()));
il faut absolument que les indexes du treeview soit en phases, donc tu ne peux q'inserrer en fin de liste.

lorsque je travaille avec les treeview je crée des objets permettant de stocker le node pour le retrouver à coup sûr.

par exemple, dans ton cas
ajoute un membre TreeNode ThemeNode; à la classe Theme

Puis dans la boucle d'insertion de themes, stocke le node correspondant:
foreach (Theme letheme in this.lesThemes.Values) 
{ 
//Création d'un noeud Root 
TreeNode node=new TreeNode(letheme.getTheme());
lethem.ThemeNode=node;
this.tvThSTh.Nodes.Add(node); 
} 


et dans la boucle d'insertion des sous themes

if (leSousTheme.getnomTheme() == letheme.getTheme()) 
{ 
//ajout du sousthem au theme principal
letheme.ThemeNode.Nodes.Add(new TreeNode(leSousTheme.getSousTheme())); 
} 


Je n'ai pas testé ce code, il est donc possible qu'il ne fonctionne pas tel que, mais c'est l'idée générale qui compte.

Bon code.
C# is amazing, enjoy it!

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Robert33
Messages postés
3
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
6 octobre 2009
0
Merci
Super ! Merci Robert ton exemple m'a permis de réaliser des ajouts n'importe où dans la liste des thèmes !

Par contre un nouveau problème, quand j'ajoute un premier sous-thème tout va bien, mais quand j'en ajoute un seconde, le premier se retrouve deux fois et ainsi de suite à chaque ajout... pour faire simple : à chaque ajout toutes les valeurs précédentes sont répétées et la listes de sous-thèmes qui devraient être la seule affichée apparait en bout de liste.

Voici ma procédure de mise à jour :

private void majListe()
        {
            tvThSTh.Nodes.Clear();

            foreach (Theme letheme in this.lesThemes.Values)
            {
                //Création d'un noeud Root
                this.tvThSTh.Nodes.Add(letheme.getNoeudTheme());

                if (this.lesSousThemes.Values.Count > 0)
                {
                    foreach (SousTheme leSousTheme in this.lesSousThemes.Values)
                    {
                        if (leSousTheme.getnomTheme() == letheme.getTheme())
                        {
                            //ajout du sous-thème au thème principal
                            letheme.getNoeudTheme().Nodes.Add(new TreeNode(leSousTheme.getSousTheme()));
                        }
                    }

                }
            }
        }


[u]
Par exemple j'ai ajoutée dans l'ordre :/u

aaa
bbb
ccc
ddd

et j'obtiens le résultat décrit auparavant :



Je ne comprends pas comment cela est possible puisque je vide mon TreeView à chaque mise à jour... j'ai regardé avec un espion ma collection LesSousThèmes et elle ne contient que les 4 sous-thèmes ajoutées, par contre mon TreeView affiche un Count de 10 pour le Noeud "A"... c'est donc qu'il y a un problème à ce niveau... est-ce que j'utilise mal la procédure Clear ?

Merci encore votre ton aide précieuse.
Commenter la réponse de sdfsdf
Messages postés
3
Date d'inscription
mercredi 23 juillet 2003
Statut
Membre
Dernière intervention
6 octobre 2009
0
Merci
J'ai résolu mon problème en modifiant mon code comme suit :

        private void majListe()
        {
            tvThSTh.Nodes.Clear();

            foreach (Theme letheme in this.lesThemes.Values)
            {
                //Création d'un noeud Root
                this.tvThSTh.Nodes.Add(letheme.getNoeudTheme());
                letheme.getNoeudTheme().Nodes.Clear();
                ...


Et ça fonctionne !
Commenter la réponse de sdfsdf