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 } } }