Как построить ASP.NET TreeView с нуля...?
Я пытаюсь построить вложенную / многопоточную систему комментариев в ASP.NET. Я не знаю, как это делают ребята из PHP. Это намного сложнее, чем предполагалось.
Я пытаюсь изо всех сил получить иерархические данные для вывода пользователю, но это не работает.
У меня есть таблица с текстом, itemID и parentID.
Я хочу отображать информацию в виде дерева, но стандартный элемент управления asp.net просто не работает...
Может ли кто-нибудь указать мне в правильном направлении, как вывести это в виде дерева. Я попытался вложить репитеры, прямо HTML здание из codebehind и дерева управления.
Я до сих пор не нашел решения... Кто-нибудь может мне помочь?
2 ответа
Быстро, по голове (не мог проверить в VS2k8 сейчас), я бы сделал это примерно так, используя Linq to SQL
private void BuildTree()
{
List<Item> items = from item in dataContext.Items
select item;
List<Item> rootItems = items.FindAll(p => p.ParentID == null );
foreach ( Item item in rootItems )
{
TreeViewNode tvi = new TreeViewNode(item.text);
BuildChildNodes(tvi, items, item.ID);
YourTreeNodeName.Nodes.Add(tvi);
}
}
private void BuildChildNodes(TreeViewNode parentNode, List<Item> items, long parentID)
{
List<Item> children = items.FindAll ( p => p.ParentID = parentID );
foreach( Item item in children)
{
TreeViewNode tvi = new TreeViewNode(item.text);
parentNode.Nodes.Add(tvi);
BuildChildNodes(tvi, items, item.ID);
}
}
Насколько я понимаю, если у вас есть таблица базы данных с иерархическими данными, у вас есть два варианта: создать собственный пользовательский источник данных или программно связать древовидное представление с таблицей базы данных.
У меня нет кода для вас, но вы можете использовать следующие шаги:
- объявить древовидное управление на странице asp.net
- заполнить DataTable (через SqlDataAdapter) вашими иерархическими данными (SELECT itemID, parentID FROM...)
- используйте эту же DataTable для создания DataView элементов верхнего уровня (parentID будет нулевым)
- для каждой строки DataView, рекурсивно добавьте элементы древовидной структуры, отфильтровав другой DataView, где parentID каждого DataViewRow равен строке, которую вы просматриваете в шаге 4
в значительной степени все это делается с помощью TreeView.Nodes.Add(theNewNode), где theNewNode является экземпляром объекта TreeNode
Я знаю, что все это звучит очень запутанно, но я делал это в прошлом. Я нашел отличную информацию в книге Стивена Уолтера ASP.NET Unleashed, в которой есть целые разделы, посвященные этому.