c # Выберите родительский узел и покажите все дочерние элементы в datagridview - PullRequest
0 голосов
/ 13 мая 2018

У меня есть таблица с именем «Механик», которая имеет рекурсивную функцию, основной идентификатор - «ID_Mechanic», а рекурсивная - «ID_Chief». Я показываю всю механику в Datagridiew. А в TreeView я показываю всю родительскую и детскую механику. И мой вопрос, как я могу создать так, чтобы при выборе родительского узла все его дочерние узлы показывались в Datagridiew?

Код, как я создаю узлы -

public void FillTree(TreeNodeCollection tn, int? id)
    {
        NpgsqlCommand cmdtreeview = new NpgsqlCommand("select * from mechanic where id_chief is null", ncon);
        if (id != null)
        {
            cmdtreeview = new NpgsqlCommand("select * from mechanic where id_chief =@id_mechanic", ncon);
            cmdtreeview.Parameters.Add(new NpgsqlParameter("id_mechanic", id));
        }
        NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmdtreeview);
        DataTable dt = new DataTable();
        da.Fill(dt);
        foreach (DataRow dr in dt.Rows)
        {
            String newdatarow = dr["name"].ToString() + " " + dr["surname"].ToString();
            TreeNode node = new TreeNode(newdatarow);
            tn.Add(node);
            FillTree(node.Nodes, (int?)dr["id_mechanic"]);
        }
    }

Заполнить -

FillTree(treeViewMechanic.Nodes, null);

Визуальное изображение того, что я имею в виду

Ty!

P.S. База данных создана в PostgreSQL.

EDIT: Код, что я получил работу, но показывает только первые родители ребенка.

 DataSet ds = new DataSet();
 ds.Tables.Add(mechanicdt);
 ds.Relations.Add(new DataRelation("mch", mechanicdt.Columns[0], 
 mechanicdt.Columns[6], true));
 private void AfterSelect(object sender, TreeViewEventArgs e)
   {
        dataGridViewMechanic.DataSource = mechanicdt;
        dataGridViewMechanic.DataMember = "mch";        
   }

РЕДАКТИРОВАТЬ: LINQ

   DataTable newTable = mechanicdt.AsEnumerable()
             .Where(i => i.Field<String>("ID_Mechanic") == null)
             .OrderByDescending(i => i.Field<String>("Surname"))
             .CopyToDataTable();

        dataGridViewMechanic.DataSource = newTable;
        dataGridViewMechanic.DataMember = "mch";          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...