Реализация дерева C#

434
11 марта 2017, 00:24

Помогите пожалуйста с алгоритмом. У меня есть список такой структуры:

public class Stratigraphy
{
    public Stratigraphy(int idType, int idSysstratigraphy, int stratparent, string name, string nameAdd, int ordernum)
    {
        IdType = idType;
        IdSysstratigraphy = idSysstratigraphy;
        Stratparent = stratparent;
        Ordernum = ordernum;
    }
    public int IdType { get; set; }
    public  int IdSysstratigraphy { get; set; }
    public int Stratparent { get; set; }
    public int Ordernum { get; set; }
}

выглядит, например, так:

Здесь IdType поле для основной сортировки. StratParent родительский элемент ссылается на IdSysstratigraphy. OrderNum порядок следования элементов я общим StratParent

Визуально мне нужно представить эту структуру таким образом:

Как продумать алгоритм, для изображения такой структуры на основании заданного списка?

Answer 1

Если не прибегать к рисованию, то можете воспользоваться стандартным контролом TreeView.

Позволяет строить различные структуры данных на основе нодов TreeNode. Каждый TreeNode имеет свойство Level и название.

Вот пример заполнения дерева. Предметная область абсолютно другая, но отсюда можете взять шаблон заполнения.

Алгоритм заполнения основан на поуровневом добавлении TreeNode в TreeView.

В вашем случае нужно делать выборку в порядке приоритета ID: Сначала выборка по родительскому ID -> Заполняете ноды 0 уровня -> Выборка по ID, дочернему к родительскому -> Заполняете ноды 1 уровня -> И так далее рекурсивно, пока не достигните последнего уровня.

public static void RefillTreeDK(DKMSContext context, TreeView tree)
        {
            tree.Nodes.Clear();
            tree.BeginUpdate();
            TreeNode node0level=null;
            TreeNode node1level = null;
            TreeNode node2level = null;
            List<dkFactory> level0Group = context.dkFactory.AsNoTracking().ToList();
            List<dkPlant> level1Group = null;
            List<dkName> level2Group = null;
            foreach(dkFactory fact in level0Group)
            {
                node0level = tree.Nodes.Add(fact.id.ToString(),fact.factoryName);
                node0level.ImageIndex = 0;
                node0level.Tag = fact.id;
                node0level.SelectedImageIndex = 0;
                level1Group = context.dkPlant.Where(x => x.idFactory == fact.id).OrderBy(x => x.plantName).ToList();
                foreach (dkPlant pl in level1Group)
                {
                    //1 уровень
                    node1level = node0level.Nodes.Add(pl.id.ToString(), pl.plantName);
                    node1level.Tag = pl.id;
                    node1level.ImageIndex = 1;
                    node1level.SelectedImageIndex = 1;

                    //2 уровень
                    level2Group = context.dkName.Where(x => x.idPlant == pl.id).ToList();
                    foreach (dkName dk in level2Group)
                    {
                        node2level = node1level.Nodes.Add(dk.id.ToString(), dk.dkTag + ": " + dk.dkDescriptor);
                        node2level.Tag = dk.id;
                        node2level.ImageIndex = 3;
                        node2level.SelectedImageIndex = 3;

                    }
                }
            }


            tree.EndUpdate();
        }
READ ALSO
Как получать id последнего зарегистрированного в вк пользователя в данный момент

Как получать id последнего зарегистрированного в вк пользователя в данный момент

Как получать id самого последнего зарегистрированного в вк пользователя средствами PHP? id должен быть самым новым на момент отправки запроса...

382
Не получается установить расширение Laravel

Не получается установить расширение Laravel

Пытаюсь установить расширение socialiteproviders/vkontakte

330
Считать новый URL на который был редирект

Считать новый URL на который был редирект

Пытаюсь авторизироваться через Вконтакте, и мне вк выдает ошибку №17

280
Правильная нумерация ПО?

Правильная нумерация ПО?

Есть версия ПО 29

285