private void m_arbreObjet_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            using (CWaitCursor waiter = new CWaitCursor())
            {
                if (e.Node.Nodes.Count != 1 || e.Node.Nodes[0].Tag != DBNull.Value)
                {
                    return;                    //C'est un vrai noeud, on ne remplit pas
                }
                e.Node.Nodes.Clear();

                if (e.Node.Tag is CObjetDonneeAIdNumerique)
                {
                    CObjetDonneeAIdNumerique objet = (CObjetDonneeAIdNumerique)e.Node.Tag;
                    CValeursHistorique       valeursHistoriques = GetValeursHistorique(objet);

                    CStructureTable structure = CStructureTable.GetStructure(objet.GetType());

                    #region relations parentes
                    //traitement des relations parentes
                    foreach (CInfoRelation relation in structure.RelationsParentes)
                    {
                        Type tpParent = CContexteDonnee.GetTypeForTable(relation.TableParente);
                        if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpParent) && relation.Propriete != "")
                        {
                            int    nImage    = c_nImageUnchanged;
                            object newValeur = objet.Row[relation.ChampsFille[0]];
                            if (newValeur == null)                            //Pour éviter les problèmes de null
                            {
                                newValeur = DBNull.Value;
                            }
                            object oldValeur = newValeur;
                            //Cherche si la valeur pour cette version a changé
                            CChampPourVersionInDb champ = new CChampPourVersionInDb(relation.ChampsFille[0], relation.ChampsFille[0]);
                            if (valeursHistoriques.ContainsKey(champ))
                            {
                                oldValeur = valeursHistoriques[champ];
                                if (!newValeur.Equals(oldValeur))
                                {
                                    nImage = c_nImageEdit;
                                }
                            }
                            TreeNode node = new TreeNode(relation.NomConvivial);
                            node.Tag                = relation;
                            node.ImageIndex         = nImage;
                            node.SelectedImageIndex = nImage;
                            e.Node.Nodes.Add(node);

                            //Ajoute la valeur actuelle
                            CObjetDonneeAIdNumerique parent = (CObjetDonneeAIdNumerique)objet.GetParent(relation.ChampsFille[0], tpParent);
                            TreeNode nodeParent             = CreateNodeObjet(node.Nodes, parent);
                            nodeParent.StateImageIndex = c_nImageActuel;

                            //Ajoute valeur historique
                            if (!newValeur.Equals(oldValeur))
                            {
                                parent     = null;
                                nodeParent = null;
                                if (oldValeur is int)
                                {
                                    //récupère l'ancien parent
                                    parent = (CObjetDonneeAIdNumerique)Activator.CreateInstance(tpParent, new object[] { objet.ContexteDonnee });
                                    if (!parent.ReadIfExists((int)oldValeur))
                                    {
                                        parent = null;
                                    }
                                }
                                nodeParent = CreateNodeObjet(node.Nodes, parent);
                                nodeParent.StateImageIndex = c_nImageHistory;
                            }
                        }
                    }
                    #endregion

                    #region relations filles
                    foreach (CInfoRelation relationFille in structure.RelationsFilles)
                    {
                        if (relationFille.NomConvivial != "")
                        {
                            Type tpFille = CContexteDonnee.GetTypeForTable(relationFille.TableFille);
                            if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpFille))
                            {
                                int      nImageNodeRelation = c_nImageUnchanged;
                                TreeNode nodeRelation       = new TreeNode(relationFille.NomConvivial);
                                e.Node.Nodes.Add(nodeRelation);

                                Hashtable tableOldIds = new Hashtable();
                                foreach (int nId in m_version.GetIdsChildsHistoriques(objet, relationFille))
                                {
                                    tableOldIds.Add(nId, true);
                                }


                                //Récupère la liste de tous les fils actuels
                                C2iRequeteAvancee requete = new C2iRequeteAvancee(-1);
                                requete.TableInterrogee = relationFille.TableFille;
                                C2iChampDeRequete champDeRequete = new C2iChampDeRequete("ID",
                                                                                         new CSourceDeChampDeRequete(objet.ContexteDonnee.GetTableSafe(relationFille.TableFille).PrimaryKey[0].ColumnName),
                                                                                         typeof(int),
                                                                                         OperationsAgregation.None,
                                                                                         true);
                                requete.ListeChamps.Add(champDeRequete);
                                CFiltreData filtre = new CFiltreData(relationFille.ChampsFille[0] + "=@1 and " +
                                                                     CSc2iDataConst.c_champIdVersion + " is null",
                                                                     objet.Id);
                                filtre.IgnorerVersionDeContexte = true;
                                requete.FiltreAAppliquer        = filtre;
                                Hashtable      tableNewIds = new Hashtable();
                                CResultAErreur result      = requete.ExecuteRequete(objet.ContexteDonnee.IdSession);
                                if (result)
                                {
                                    foreach (DataRow row in ((DataTable)result.Data).Rows)
                                    {
                                        tableNewIds.Add(row[0], true);
                                    }
                                }
                                //Ajoute les ids actuels
                                foreach (int nId in tableNewIds.Keys)
                                {
                                    CObjetDonneeAIdNumerique fils = (CObjetDonneeAIdNumerique)Activator.CreateInstance(tpFille, new object[] { objet.ContexteDonnee });
                                    if (fils.ReadIfExists(nId))
                                    {
                                        int nImage = -1;
                                        if (!tableOldIds.ContainsKey(nId))
                                        {
                                            nImage             = c_nImagePlus;
                                            nImageNodeRelation = c_nImageEdit;
                                        }
                                        TreeNode nodeFille = CreateNodeObjet(nodeRelation.Nodes, fils);
                                        if (nImage >= 0)
                                        {
                                            nodeFille.StateImageIndex = nImage;
                                        }
                                    }
                                }
                                //Ajoute les vieux ids
                                foreach (int nId in tableOldIds.Keys)
                                {
                                    if (!tableNewIds.ContainsKey(nId))
                                    {
                                        CObjetDonneeAIdNumerique fils = (CObjetDonneeAIdNumerique)Activator.CreateInstance(tpFille, new object[] { objet.ContexteDonnee });
                                        if (fils.ReadIfExists(nId))
                                        {
                                            int nImage = c_nImageMoins;
                                            nImageNodeRelation = c_nImageEdit;
                                            TreeNode nodeFille = CreateNodeObjet(nodeRelation.Nodes, fils);
                                            nodeFille.StateImageIndex = nImage;
                                        }
                                    }
                                }
                                nodeRelation.ImageIndex         = nImageNodeRelation;
                                nodeRelation.SelectedImageIndex = nImageNodeRelation;
                            }
                        }
                    }
                    #endregion
                }
            }
        }