У меня есть таблица с именем «Механик», которая имеет рекурсивную функцию, основной идентификатор - «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";