c#选择父节点,并在datagridview中显示所有子节点

c#选择父节点,并在datagridview中显示所有子节点,c#,winforms,psql,C#,Winforms,Psql,我有一个名为“mechanical”的表,它有递归,主id是“id\u mechanical”,递归是“id\u Chief”。 我在Datagridiew中显示所有机制。 在TreeView中,我展示了所有的父和子机制。 我的问题是,如何创建这样的节点,当我选择父节点时,它的所有子节点都显示在Datagridiew中 编写如何创建节点的代码- public void FillTree(TreeNodeCollection tn, int? id) { NpgsqlCom

我有一个名为“mechanical”的表,它有递归,主id是“id\u mechanical”,递归是“id\u 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);

p.S.数据库是在PostgreSQL中创建的

编辑: 代码我得到的工作,但只显示第一父母的孩子

 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";        
   }
编辑:林克

   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";          
DataTable newTable=mechanicdt.AsEnumerable()
其中(i=>i.Field(“ID\u”)==null)
.OrderByDescending(i=>i.Field(“姓氏”))
.CopyToDataTable();
DataGridViewMechanical.DataSource=newTable;
DataGridViewMechanical.DataMember=“mch”;

处理树状视图项上的单击事件,并填充数据网格视图的项源。@ShivaniKatukota好的,我知道如何只显示child,但它只显示第一个父项child,如果我单击“其他”,它会显示给我,我怎么能这样做?你能发布你尝试过的代码和它不起作用的代码吗?@ShivaniKatukota在post中添加了“编辑”代码,这是因为你正在用相同的数据集实例化数据源。在方法AfterSelect中,使用linq过滤数据集mechanicdt,仅过滤那些将发件人作为父级的成员