TreeView Collection et Index [Résolu]

sdfsdf 3 Messages postés mercredi 23 juillet 2003Date d'inscription 6 octobre 2009 Dernière intervention - 3 oct. 2009 à 20:10 - Dernière réponse : sdfsdf 3 Messages postés mercredi 23 juillet 2003Date d'inscription 6 octobre 2009 Dernière intervention
- 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 

Votre réponse

3 réponses

Meilleure réponse
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 4 oct. 2009 à 09:45
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de cs_Robert33
sdfsdf 3 Messages postés mercredi 23 juillet 2003Date d'inscription 6 octobre 2009 Dernière intervention - 6 oct. 2009 à 00:27
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
sdfsdf 3 Messages postés mercredi 23 juillet 2003Date d'inscription 6 octobre 2009 Dernière intervention - 6 oct. 2009 à 00:42
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.