//---------------------------------------------
        private void ShowProprietes(CObjetDonneeAIdNumerique objet)
        {
            if (objet == null)
            {
                m_grilleProprietes.DataSource = null;
                return;
            }

            DataTable table = new DataTable();

            m_strColChamp            = I.T("Field|120");
            m_strColValeurHistorique = I.T("History|121");
            m_strColValeurCourante   = I.T("Current|122");


            DataColumn col = new DataColumn(m_strColChecked, typeof(bool));

            col.Caption = "";
            table.Columns.Add(col);

            table.Columns.Add(m_strColChamp);
            if (m_version.TypeVersion.Code != CTypeVersion.TypeVersion.Previsionnelle)
            {
                table.Columns.Add(m_strColValeurHistorique);
            }
            table.Columns.Add(m_strColValeurCourante);
            if (m_version.TypeVersion.Code == CTypeVersion.TypeVersion.Previsionnelle)
            {
                m_strColValeurHistorique = I.T("Version|123");
                table.Columns.Add(m_strColValeurHistorique);
            }
            table.Columns.Add(m_strColObjetHistorique, typeof(IChampPourVersion));

            CValeursHistorique valeurs = GetValeursHistorique(objet);

            m_valeursAffichees = valeurs;
            m_objetAffiche     = objet;
            CStructureTable structure = CStructureTable.GetStructure(objet.GetType());

            foreach (CInfoChampTable champ in structure.Champs)
            {
                if (champ.Propriete != "")
                {
                    DataRow row = table.NewRow();
                    row[m_strColChecked]         = false;
                    row[m_strColChamp]           = champ.NomConvivial;
                    row[m_strColObjetHistorique] = DBNull.Value;

                    if (champ.TypeDonnee == typeof(CDonneeBinaireInRow))
                    {
                        CDonneeBinaireInRow donnee = new CDonneeBinaireInRow(objet.ContexteDonnee.IdSession, objet.Row.Row, champ.NomChamp);
                        row[m_strColValeurCourante] = donnee.Donnees;
                    }
                    else
                    {
                        row[m_strColValeurCourante] = objet.Row[champ.NomChamp];
                    }

                    CChampPourVersionInDb champVersion = new CChampPourVersionInDb(champ.NomChamp, champ.NomConvivial);
                    if (valeurs.ContainsKey(champVersion))
                    {
                        row[m_strColObjetHistorique] = champVersion;
                        object val = valeurs[champVersion];
                        if (val == null)
                        {
                            row[m_strColValeurHistorique] = DBNull.Value;
                        }
                        else
                        {
                            row[m_strColValeurHistorique] = val.ToString();
                        }
                    }
                    else
                    {
                        row[m_strColValeurHistorique] = objet.Row[champ.NomChamp];
                    }
                    table.Rows.Add(row);
                }
            }

            //Champs custom
            if (objet is IElementAChamps)
            {
                Dictionary <CChampCustom, bool> lstChamps = new Dictionary <CChampCustom, bool>();
                foreach (IDefinisseurChampCustom definisseur in ((IElementAChamps)objet).DefinisseursDeChamps)
                {
                    foreach (CChampCustom champ in definisseur.TousLesChampsAssocies)
                    {
                        if (champ.TypeDonneeChamp.TypeDonnee != TypeDonnee.tObjetDonneeAIdNumeriqueAuto)
                        {
                            lstChamps[champ] = true;
                        }
                    }
                }
                foreach (CChampCustom champCustom in lstChamps.Keys)
                {
                    DataRow row = table.NewRow();
                    row[m_strColChecked]         = false;
                    row[m_strColChamp]           = champCustom.LibelleConvivial;
                    row[m_strColObjetHistorique] = DBNull.Value;
                    row[m_strColValeurCourante]  = ((IElementAChamps)objet).GetValeurChamp(champCustom.Id);
                    CChampCustomPourVersion chVersion = new CChampCustomPourVersion(champCustom);
                    if (valeurs.ContainsKey(chVersion))
                    {
                        row[m_strColObjetHistorique] = chVersion;
                        object val = valeurs[chVersion];
                        if (val == null)
                        {
                            row[m_strColValeurHistorique] = DBNull.Value;
                        }
                        else
                        {
                            row[m_strColValeurHistorique] = val.ToString();
                        }
                    }
                    else
                    {
                        row[m_strColValeurHistorique] = row[m_strColValeurCourante];
                    }
                    table.Rows.Add(row);
                }
            }
            table.DefaultView.Sort              = m_strColChamp;
            m_grilleProprietes.DataSource       = table;
            m_grilleProprietes.ReadOnly         = false;
            m_grilleProprietes.Columns[0].Width = 32;
            foreach (DataGridViewColumn colTmp in m_grilleProprietes.Columns)
            {
                colTmp.ReadOnly = true;
            }
            m_grilleProprietes.Columns[0].ReadOnly = false;
            if (!m_bCanRestore)
            {
                m_grilleProprietes.Columns[0].Visible = false;
            }
            m_grilleProprietes.Columns[m_grilleProprietes.Columns.Count - 1].Visible = false;
        }
        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
                }
            }
        }