У меня есть 5 таблиц в классах L2S dbml: Global → Категории → Подкатегория → Элемент → Данные элемента. Я хочу иметь возможность перемещаться из таблицы Global вниз по дереву, подобному структуре, чтобы перейти к элементам - отобразить заголовок из таблицы данных элемента.
У меня есть существующий элемент управления, который использует расширенный набор IHierarchyData/IHierarchicalEnumerable, итерируя по коллекции для вывода неупорядоченного списка, который затем я превращаю в дерево с jquery. Я сделал это на основе Возвращает Un-Ordered List из иерархических данных sql
Есть ли простой общий способ, который я мог бы использовать, чтобы поместить данные из приведенной выше структуры таблицы в иерархическую структуру, чтобы я мог повторно использовать мой существующий элемент управления и просто пройти в другой коллекции.
Вы пробовали Вложенные списки просмотров? Я реализовал это решение на нескольких страницах. Я использую ObjectDataSources вместо LinqDataSources напрямую, чтобы поддерживать логику данных отдельно, но вложенные EntitySets работают красиво.
Так как вы имеете дело с различными типами в этом случае, вам придется реализовать общий интерфейс для каждого из них, чтобы сделать общий код. Основной подход заключался бы в создании интерфейса, который включает любые необходимые свойства (например, DisplayText, ActionURL и т.д.), А затем рекурсивно перебирает коллекцию.
Вот пример:
public interface IDataItem
{
string DisplayText { get; }
string ActionUrl { get; }
bool HasChildren { get; }
IEnumerable<IDataItem> GetChildren();
}
public void CreateTree(HtmlTextWriter writer, IEnumerable<IDataItem> collection)
{
writer.WriteFullBeginTag("ul");
foreach (var data in collection)
{
writer.WriteFullBeginTag("li");
writer.WriteBeginTag("a");
writer.WriteAttribute("href",data.ActionUrl);
writer.Write(HtmlTextWriter.TagRightChar);
writer.Write(data.DisplayText);
writer.WriteEndTag("a");
if(data.HasChildren)
CreateTree(writer, data.GetChildren());
writer.WriteEndTag("li");
}
writer.WriteEndTag("ul");
}
Вам нужно будет реализовать интерфейс для каждого из ваших типов, который вы хотите включить в treeview. Простое совпадение в коллекции типа верхнего уровня и вышеописанного метода спустится по иерархии, создав необходимый вложенный список.
Вы можете использовать оператор Union, чтобы объединить ваши четыре таблицы вместе. http://weblogs.asp.net/zeeshanhirani/archive/2008/04/11/union-operator-part-12.aspx
Я думаю, что вы повесили, что вам не нужны четыре таблицы для этого.
Посмотрите снова вернуть неупорядоченный список из иерархических данных sql. Там нет четырех таблиц. Там только один.