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 :-)
3 avril 2009 à 00:35
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();
}
30 mars 2009 à 15:34
C'est comme toujours de grande qualité.
13 janv. 2009 à 18:45
trop utile ton truc,
Bonne continuation
30 oct. 2007 à 13:43
merci
30 oct. 2007 à 12:58
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.