Linq : binder un treeview avec un ienumerable : l'extension de méthode tohierarchicalenumerable

Soyez le premier à donner votre avis sur cette source.

Vue 15 798 fois - Téléchargée 371 fois

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 / Exemple :


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 :-)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 2 avril 2009
Statut
Membre
Dernière intervention
3 avril 2009

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();
}
Messages postés
2
Date d'inscription
mardi 20 avril 2004
Statut
Membre
Dernière intervention
30 mars 2009

Merci Cyril.
C'est comme toujours de grande qualité.
Messages postés
3
Date d'inscription
mercredi 31 janvier 2007
Statut
Membre
Dernière intervention
13 janvier 2009

Trop fort Jesus !
trop utile ton truc,
Bonne continuation
Messages postés
31
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
27 août 2008

ok ... je vais voir
merci
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
25
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.
Afficher les 8 commentaires

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.