Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LINQ : BINDER UN TREEVIEW AVEC UN IENUMERABLE : L'EXTENSION DE MÉTHODE TOHIERARCHICALENUMERABLE


Information sur la source

Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous : linq, linqtosql, methodextension, treeview, ihierarchialenumerable Niveau : Expert Date de création : 23/07/2007 Date de mise à jour : 25/09/2007 17:28:09 Vu / téléchargé: 9 409 / 164

Note :
Aucune note

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

Il est fréquent d'avoir à binder un treeview/menu à partir d'une table de la base de données. Par exemple une table category définit comme ceci :

      - CategoryID int
      - ParentCategory int
      - Name nvarchar(255)

Dans ce cas, ASP.net ne propose pas de solution miracle, on a deux solutions : soit l'on rajoute manuellement les noeuds un à un dans le treeview / menu soit on utilise l'interface IHierarchialEnumerable que je vous est déjà présenté ici : http://www.aspfr.com/codes/interface-IHierarchicalEnumerable-bindez-vos-menu-treeview_43234.aspx

C#3 / .net 3.5, introduit la notion d'extension de méthode, ces méthodes particulières se greffent à l'instance d'un objet, on peut ainsi rajouter une méthode ToHierarchicalEnumerable à un type ou une interface particulière, par exemple l'interface IEnumerable<T>.

Ce code rajoute donc l'extension de méthode ToHierarchicalEnumerable à l'interface IEnumerable<T> ce qui permet de binder vos treeview en quelques lignes à partir du moment où vous travaillez avec un IEnumerable<T>. Cela tombe bien Linq To Sql renvoie des IEnumerable<T>. ;-)

Le code ci dessous est un exemple d'utilisation de cette extension de méthode. Le code interessant se trouve dans le zip.

Les arguments de la méthode sont des lambdas expressions qui retournent l'id courant, l'id du parent, le type du noeud, le path du noeud. Les deux derniers arguments se trouvent dans d'autres signatures.
 

Source

  • protected void Page_Load(object sender, EventArgs e)
  • {
  • var dc = new Data.AjaxLibraryDataContext();
  • var categories = from c in dc.Categories
  • orderby c.Name
  • select c;
  • tvCategories.DataSource = categories.ToHierarchicalEnumerable(cat => cat.CategoryID, cat => cat.parentCategoryID);
  • tvCategories.DataBind();
  • }
        protected void Page_Load(object sender, EventArgs e)
        {
            var dc = new Data.AjaxLibraryDataContext();

            var categories = from c in dc.Categories
                             orderby c.Name 
                             select c;

            tvCategories.DataSource = categories.ToHierarchicalEnumerable(cat => cat.CategoryID, cat => cat.parentCategoryID);
            tvCategories.DataBind();

        }

Conclusion

Je n'ai pas testé avec toutes les collections de IEnumerable<T>. Il se peut qu'il y ait des problèmes s'il y a des noeuds orphelins, ou des boucles au niveau des noeuds (le parent du noeud est aussi le fils de ce noeud).

Si vous tombez sur un bug, remontez le moi dans les commentaires, idems si vous améliorez le code, ou tout simplement si vous l'utilisez :-)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

25 septembre 2007 17:28:09 :
modification de catégorie pour test

Commentaires et avis

signaler à un administrateur
Commentaire de Magjjy le 30/10/2007 12:23:08

Salut,
en tant que débutante, j'ai ajouter la classe dans le app_code mais j'obtiens les erreurs ci-dessous.
Peux-tu détailler un peu plus la marche à suivre pour implémenter cette classe.

Merci de ta patience.

Liste des erreurs :

C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,88): erreur CS1031: Type attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,129): erreur CS1002: ; attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,138): erreur CS1519: Jeton ',' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,144): erreur CS1519: Jeton '>' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,158): erreur CS1519: Jeton ',' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(27,192): erreur CS1002: ; attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,20): erreur CS1520: Une méthode de classe, de structure ou d'interface doit posséder un type de retour
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,53): erreur CS1001: Identificateur attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,67): erreur CS1001: Identificateur attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,80): erreur CS1001: Identificateur attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,86): erreur CS1001: Identificateur attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,87): erreur CS1525: Terme d'expression non valide '>'
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,89): erreur CS1026: ) attendue
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,101): erreur CS1519: Jeton ',' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,107): erreur CS1519: Jeton '=' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(29,122): erreur CS1519: Jeton ')' non valide dans la déclaration de membres de la classe, de la structure ou de l'interface
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(41,23): erreur CS1518: Class, delegate, enum, interface ou struct attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(56,23): erreur CS1518: Class, delegate, enum, interface ou struct attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(58,37): erreur CS1518: Class, delegate, enum, interface ou struct attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(60,24): erreur CS1518: Class, delegate, enum, interface ou struct attendu
C:\Projets\Catalogue\Catalogue\App_Code\LinqHierarchicalExtension.cs(63,5): erreur CS1022: Définition de type ou d'espace de noms, ou fin de fichier attendue

signaler à un administrateur
Commentaire de jesusonline le 30/10/2007 12:33:22 administrateur CS

c'est du C#3.5 donc VS2008.

signaler à un administrateur
Commentaire de Magjjy le 30/10/2007 12:40:57

effectivement ... ca ne pouvait pas fonctionner !
Je cherche en fait à créer un treeview depuis une table catégorie (Indexe, libelle, idparent) ... avec VS2005.
Pourais-tu m'éguiller dans cette démarche que je suppose tu as déjà dû mettre en oeuvre ...
vu ton niveau de développement ASP.NET !!!

Merci de ton aide

signaler à un administrateur
Commentaire de jesusonline le 30/10/2007 12:58:54 administrateur CS

Renseigne toi sur les extensions de méthode, les lambda expression et tu verras que le code ici peut être utilisé ... suffit juste de le lire et de modifier une petite chose.

signaler à un administrateur
Commentaire de Magjjy le 30/10/2007 13:43:47

ok ... je vais voir
merci

signaler à un administrateur
Commentaire de guilhemberthalon le 13/01/2009 18:45:47

Trop fort Jesus !
trop utile ton truc,
Bonne continuation

signaler à un administrateur
Commentaire de LordArthis le 30/03/2009 15:34:18

Merci Cyril.
C'est comme toujours de grande qualité.

signaler à un administrateur
Commentaire de artcava le 03/04/2009 00:35:51

Hi Jesus, I try in English...
I've this problem, my treeview is not rendered on the page...
Debugging I can see a lot of elements in _currentElements, but no one in _addedElements, that are 2 internal lists...

Any idea?

        protected void Page_Load(object sender, EventArgs e)
        {
            var dc = new FoldersDataContext();
            var folders = from f in dc.FOLDERs
                          orderby f.Position
                          select f;

            twFolders.DataSource = folders.ToHierarchicalEnumerable(folder => folder.FolderId, folder => folder.ParentId);
            twFolders.DataBind();
        }

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

question Linq to sql [ par ChamY ] Bonjour,Je bloque sur un truc surement bête et je recherche de l'aide surr du Linq To Sql.Donc j'ai une page avec un gridview qui liste mes taches et Treeview [ par thybang ] Bonjour, Je suis en train de créer une Treeview.Pour chacun de ses nodes, je voudrai ajouter une image qui me permettrai d'ajouter un élément fils.J'u MaintainScrollPositionOnPostBack ne marche pas ! [ par DxMachina ] Bonjour, J'aimerais sauvegarder la position du scrollbar vertical de mon Treeview lors des callBacks ajax, cette question a déjà été posée avec comme Treeview aux fonctions étendues [ par equinoxe83 ] Bonjour à tous,J'ai une base de données qui intègre 3 tables thème, article, couleur.J'arrive bien à remplir mon treeview avec les éléments en mode hi Programmer un Treeview [ par dorine82 ] Salut à tous,Je suis une debutante en asp.net et je voudrais votre aide par rapport à un Programme. En fait je dois editer un Treeview. Au depart sur linq - jointure de table [ par wally88 ] Bonjour,  je n'arrive pas a joindre mes tables ou a "trier" :'(exemple pour récupérer les lignes en rapport entre deux tables, je lui dis que la table treeview imagelist [ par momper ] Bonjour,Ci-dessous voici un code de microsoft trouvé à cette adresse : http://support.microsoft.com/kb/184975/EN-US/J'ai un problème sur mon propre tr Problème ItemDataBound, DataItem avec LINQ [ par walterskinner ] Bonjour, Cela fait maintenant deux jours que je cherche LinqToSql générique peupler une dropdownlist [ par sspizer ] Bonjour,Actuellement j'aimerais remplir une dropdownlist de facon générique:public void GetData(MydataContext c){   ...}Anciennement on passait en par erreur due à InsertAllOnSubmit() [ par khawlaaa ] Bonjour tout le monde , je suis entrain de travailler sur un WebSite ( asp.net et C#) j'ai divisé mon projet en 3 couches: *UI *BLL *DAO L


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,718 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.