Элемент нумерации в иерархическом списке C # - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть иерархический список типа Element. Каждый Element имеет ParentElement и коллекцию ChildElements.

Я написал рекурсивный помощник HTML, чтобы пройтись по иерархическому списку и распечатать каждый элемент в строку таблицы. Я хочу иметь возможность пометить каждый из элементов в таблице на основе их положения в иерархическом списке. Например

Example List

Подструктура не имеет дочерних элементов

Надстройка имеет 3 ChildElements - верхние этажи, рама и крыша

Верхние этажи и каркас не имеют дочерних элементов

Крыша имеет 2 ChildElements - Кровельные покрытия и конструкция крыши

У меня есть следующий HTML в представлении, которое вызывает рекурсивный помощник.

<table class="table table-bordered">
     <thead>
         <tr>
             <td>Reference</td>
             <td>Name</td>
         </tr>
     </thead>
     <tbody>
         @ShowTreeTable(Model.Elements, 1)
     </tbody>
</table>

Рекурсивный помощник выглядит следующим образом.

@helper ShowTreeTable(List<Entities.Entities.Element> elements, int level)
{
    for (int i = 0; i < elements.Count(); i++)
    {
        <tr>
            <td>@level</td>
            <td>@elements[i].Name</td>
        </tr>

        if (elements[i].ChildElements.Any())
        {
            @ShowTreeTable(elements[i].ChildElements.ToList(), level + 1)
        }
    }
}

У меня был более тщательно продуманный помощник, когда я пытался сделать это, но он не был близок, поэтому я лишил его этого.

В текущем примере результаты выглядят так.

Current Example Results

1 Ответ

0 голосов
/ 15 ноября 2018

Я получил эту работу, манипулируя деревом в C # до того, как оно было помещено в представление.

Сначала я получил корневые элементы и установил их ссылочное свойство в их положение в списке (+1).

var roots = this.Elements.Where(x => !x.ParentElementId.HasValue).ToList();

this.Elements.Where(x => !x.ParentElementId.HasValue).ToList()
    .ForEach(x => x.Reference = (roots.IndexOf(x) + 1).ToString());

Затем я написал другой рекурсивный метод для обновления всех ссылок на дочерние элементы. Сложнее всего было обновить все дочерние родительские элементы, прежде чем они получат собственную ссылку. Если это не было сделано, все дочерние элементы содержали ссылку на родительский элемент, у которого не было обновленной ссылки.

private void ShowTree(List<Entities.Entities.Element> elements)
{
    for (int i = 0; i < elements.Count(); i++)
    {
        if (elements[i].ParentElementId.HasValue)
        {
            elements[i].Reference = $"{elements[i].ParentElement.Reference}.{i+1}";
        }

        if (elements[i].ChildElements.Any())
        {
            foreach (var child in elements[i].ChildElements)
            {
                 child.ParentElement = elements[i];
            }

            this.ShowTree(elements[i].ChildElements.ToList());
        }
    }
}

В сочетании с HTML-кодом в OP были получены правильные иерархические ссылки.

enter image description here

...