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

Soyez le premier à donner votre avis sur cette source.

Vue 16 153 fois - Téléchargée 398 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
artcava Messages postés 1 Date d'inscription jeudi 2 avril 2009 Statut Membre Dernière intervention 3 avril 2009
3 avril 2009 à 00:35
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();
}
LordArthis Messages postés 2 Date d'inscription mardi 20 avril 2004 Statut Membre Dernière intervention 30 mars 2009
30 mars 2009 à 15:34
Merci Cyril.
C'est comme toujours de grande qualité.
guilhemberthalon Messages postés 3 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 13 janvier 2009
13 janv. 2009 à 18:45
Trop fort Jesus !
trop utile ton truc,
Bonne continuation
Magjjy Messages postés 31 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 27 août 2008
30 oct. 2007 à 13:43
ok ... je vais voir
merci
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
30 oct. 2007 à 12:58
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.

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.