Логика для отображения бесконечного дерева категорий во вложенных <ul>с из Self Join Table - PullRequest
5 голосов
/ 15 августа 2010

Пожалуйста, помогите мне решить мою большую проблему.В моем проекте он-лайн покупок я создал динамический список категорий (с бесконечной глубиной уровня) Реализован в одной таблице в БД с самостоятельным объединением.схема как ниже: альтернативный текст http://aspalliance.com/ArticleFiles/822/image002.gif

Обновление
Я хочу использовать плагин JQuery для создания многоуровневой панели меню.этот плагин использует элементы <ul> и <li>, поэтому я должен преобразовать таблицу БД в <ul> и <li>.результат должен выглядеть так:

<ul>
  <li>Clothing 1
    <ul>
      <li>Trousers 2
        <ul>
          <li>Mens trousers 3</li>
          <li>Ladies trousers 3</li>
        </ul>
      </li> 
      <li>Jackets 2</li>
      <li>Shirts 2</li>
      <li>Shoes
        <ul>
          <li>Mens shoes 3
            <ul>
              <li>Mens formal shoes 4</li>
              <li>Mens casual shoes 4</li>
            </ul>
          </li>
          <li>Kids shoes 3</li>
          <li>Ladies shoes 3</li>
        </ul>
      </li>
    </ul>
   </li>
  <li>Cars 1
   <ul>
     <li>Small cars 2</i>
   </ul>
  </li>
</ul>

Я могу использовать элемент управления вложенными данными (например, элемент управления повторителем), но вы знаете, с помощью этого решения я могу просто реализовать список с бесконечной иерархической древовидной структурой. пожалуйста, помогите мне!любое предложение??Я гуглил в интернете, но не нашел подходящего способа.Я использую ASP.net 3.5 и LINQ . какой самый лучший способ?

Ответы [ 2 ]

10 голосов
/ 18 августа 2010

Используйте этот рекурсивный метод

private string GenerateUL(IQueryable<Menu> menus)
{
    var sb = new StringBuilder();

    sb.AppendLine("<ul>");
    foreach (var menu in menus)
    {
        if (menu.Menus.Any())
        {
            sb.AppendLine("<li>" + menu.Text);
            sb.Append(GenerateUL(menu.Menus.AsQueryable()));
            sb.AppendLine("</li>");
        }
        else
            sb.AppendLine("<li>" + menu.Text + "</li>");
    }
    sb.AppendLine("</ul>");

    return sb.ToString();
}

вот так

DataClasses1DataContext context = new DataClasses1DataContext();
var s = GenerateUL(context.Menus.Where(m => m.ParentID == null));
Response.Write(s);
0 голосов
/ 15 августа 2010

Я думаю, что ASP.NET TreeView ваш друг.

Взгляните здесь тоже.

Кроме того, вы можете использовать динамически создаваемые вложенные DataGrid или Repeater, вот пример (вы можете сделать его динамическим, чтобы вложенные (или даже родительские) повторители генерировались программно.

void GenerateChildren(Menu menu)
{
    //Create DataGridRow/RepeaterRow/TreeViewNode/whatever for this menu
    menu.Children.Load();
    foreach (var child in menu.Children)
    {
        GenerateChildren(child);        
    }
}

Обновление Смотрите пример 5 на этой странице. Я бы порекомендовал генерировать код jQuery по серверу, чтобы вам было проще управлять как менюми, так и меню, генерируемыми jQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...