-4

i have the following DataTable in c#

_id  |  name  | _id_parent
__________________________
 1   | item1  |   0
 2   | item2  |   1
 3   | item3  |   1
 4   | item4  |   2
 5   | item5  |   2
 6   | item6  |   3
 7   | item7  |   5

i need to convert to nested <list> like it:

item1
|---item2
    |---item4
    |---item5
        |---item7
|---item3
    |---item6

there is some method that does that?

1 Answers1

1

Try recursion :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static DataTable dt = null;
        static void Main(string[] args)
        {
            dt = new DataTable();
            dt.Columns.Add("_id", typeof(int));
            dt.Columns.Add("_name", typeof(string));
            dt.Columns.Add("_id_parent", typeof(int));

            dt.Rows.Add(new object[] {1, "item1",0});
            dt.Rows.Add(new object[] {2, "item2",1});
            dt.Rows.Add(new object[] {3, "item3",1});
            dt.Rows.Add(new object[] {4, "item4",2});
            dt.Rows.Add(new object[] {5, "item5",2});
            dt.Rows.Add(new object[] {6, "item6",3});
            dt.Rows.Add(new object[] {7, "item7",5});

            Node.root.id = 0;
            Node.MakeTree(dt, Node.root);
        }
    }
    public class Node
    {
        public static Node root = new Node();


        public string name { get; set; }
        public int id { get; set; }
        public List<Node> children { get; set; }

        public static void MakeTree(DataTable dt, Node parent)
        {
            foreach(DataRow row in dt.AsEnumerable().Where(x => x.Field<int>("_id_parent") == parent.id))
            {
                if (parent.children == null)
                {
                    parent.children = new List<Node>();
                }
                Node newNode = new Node();
                newNode.name = row.Field<string>("_name");
                newNode.id = row.Field<int>("_id");
                parent.children.Add(newNode);
                MakeTree(dt, newNode);
            }
        }


    }

}
jdweng
  • 33,250
  • 2
  • 15
  • 20